我认为定义一个查询并稍后将其用于多次选择或计数是一个好主意,但它不起作用。第二个选择在 sql 语句中有两者 where
:
$query = Pic::where('pics.user_id',$user->id);
if($cat) $query->where('cat',$cat);
if($year) $query->where('jahrprod',$year);
$zb = $query->select('pics.id','pics.title','pics.created_at')
->where('pics.id', '>', $pic->id)
->orderBy('pics.id')
->take(2)
->get()->reverse();
$za = $query->select('pics.id','pics.title','pics.created_at')
->where('pics.id', '<', $pic->id)
->orderBy('pics.id')
->take(13)
->get();
查询:
SELECT `pics`.`id`, `pics`.`title`, `pics`.`created_at`
FROM `pics`
WHERE `pics`.`user_id` = '3'
AND `pics`.`id` > '2180'
AND `pics`.`id` < '2180'
ORDER BY `pics`.`id` ASC, `pics`.`id` ASC
LIMIT 13
我尝试“将其作为引用传递”,即 &$query->select...
但“只有变量可以作为引用传递”。
如何使用查询,或保存它,并将其用于这两个操作。可能吗?
最佳答案
当您执行 $query->where() 时,您正在使用语句更新对象状态,所以是的,当您进行第二次选择时,第一个选择中的所有条件仍然存在。这就是这些行在没有任何分配的情况下工作的原因:
if($cat) $query->where('cat',$cat);
if($year) $query->where('jahrprod',$year);
要实现所描述的行为,您需要创建一个查询对象副本:
$query = Pic::where('pics.user_id',$user->id);
if($cat) $query->where('cat',$cat);
if($year) $query->where('jahrprod',$year);
$queryClone = clone $query;
$zb = $query->select('pics.id','pics.title','pics.created_at')
->where('pics.id', '>', $pic->id)
->orderBy('pics.id')
->take(2)
->get()->reverse();
$za = $queryClone->select('pics.id','pics.title','pics.created_at')
->where('pics.id', '<', $pic->id)
->orderBy('pics.id')
->take(13)
->get();
请注意,单纯的赋值在这里不起作用:
$queryClone = $query;
因为这会传递对象引用并会导致与您的情况相同的行为。克隆创建完整的对象副本。
关于php - 如何在 Laravel 中使用一个查询来进行不同的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859485/