【问题标题】:How to use one query for different selects in laravel?如何在 laravel 中对不同的选择使用一个查询?
【发布时间】:2016-06-16 12:37:33
【问题描述】:

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

$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

我尝试“将其作为参考传递”,即&amp;$query-&gt;select...,但“只有变量可以作为参考传递”。

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

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

    当您执行 $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

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2021-04-05
      • 2016-04-24
      • 2014-09-29
      • 1970-01-01
      • 2023-01-18
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多