所以我遇到了一个与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'功能,对于将来的用例一定会牢记这一点。 –