2016-06-16 28 views
2

我認爲這是一個好主意,定義一個查詢並將其用於多個選擇或計數後,但它不起作用。第二個選擇具有where S IN的SQL語句:如何在laravel中爲不同的選擇使用一個查詢?

$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...但「只有變量可以傳遞作爲參考「。

如何使用該查詢或保存該查詢並將其用於這兩個操作。可能嗎?

回答

3

當您執行$ 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

+0

打我吧+1 –

相關問題