如何在laravel中使用一个查询进行不同的选择?

时间:2016-06-16 12:37:34

标签: php sql laravel

我认为定义一个查询并将其用于以后的几个选择或计数是一个好主意,但它不起作用。第二个选择在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...,但“只有变量可以作为参考传递”。

如何使用查询或保存查询,并将其用于这两个操作。有可能吗?

1 个答案:

答案 0 :(得分:3)

当您执行$ query-&gt; 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;

因为它会传递对象引用,并且会导致与您的情况相同的行为。克隆会创建一个完整的对象副本。

http://php.net/manual/en/language.oop5.cloning.php