代码之家  ›  专栏  ›  技术社区  ›  haheute

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

  •  2
  • haheute  · 技术社区  · 10 年前

    我认为定义一个查询并在稍后将其用于多次选择或计数是一个好主意,但它不起作用。第二个选择有 二者都 where sql语句中的:

    $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 回复  |  直到 10 年前
        1
  •  3
  •   Tadas Paplauskas    10 年前

    执行$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;
    

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

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