2017-06-01 49 views
1

所以我遇到了一個與QueryBuilder克隆有關的問題。他是我的情況,我需要運行3個獨立的查詢,所有基於落單「BaseQuery」:PHP Laravel查詢克隆不能按預期工作

$baseQuery = $model->selectRaw("column")->whereNull("deleted_at"); 

$query1 = clone($baseQuery); 
$query1Results = $query1->where("condition", "=", 0)->get(); 

$query2 = clone($baseQuery); 
$query2Results = $query2->where("condition2", "=", 1)->get(); 

$query3 = clone($baseQuery); 
$query3Results = $query3->where("condition3", "=", 0)->get(); 

到時候我到$query3,它有3個,其中報表。代$query3 ... get()$query3 ... ->toSql();顯示這些結果:

SELECT `column` FROM `models` WHERE `deleted_at` IS NULL AND `condition` = ? AND `condition2` = ? AND `condition3` = ?; 

看來,即使我定義每個$queryX作爲$baseQuery克隆,附加條款->where()被應用到每個查詢。在添加任何->where()子句之前,我已嘗試執行clone(),但這沒有任何影響。

有沒有一種方法clone()東西,並確保它創建一個新的實例?它看起來像clone()不是從$queryX分離$baseQuery,所以->where() s正在應用於每個後續副本,即使每個應該是一個只有->whereNull()子句的新查詢。

另一個有趣的一點是,運行

\Log::info($baseQuery == $queryX); 

每次修改後返回true===false雖然)

回答

1

你應該在這裏使用scopes

本地範圍允許您定義常見的一組約束,您可以在整個應用程序中輕鬆地重複使用這些約束。例如,您可能需要經常檢索所有被認爲「流行」的用戶。要定義範圍,只是前綴雄辯的模型方法與範圍

public function scopeBase($q) 
{ 
    return $q->selectRaw('column')->whereNull('deleted_at'); 
} 

然後就做這樣的事情:

$query1Results = $model->where('condition', 0)->base()->get(); 
$query2Results = $model->where('condition2', 1)->base()->get(); 
$query3Results = $model->where('condition3', 0)->base()->get(); 
+1

也做到了;不熟悉'QueryBuilder'的'scope'功能,對於將來的用例一定會牢記這一點。 –