所以我遇到了一個與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
雖然)
也做到了;不熟悉'QueryBuilder'的'scope'功能,對於將來的用例一定會牢記這一點。 –