所以我遇到了QueryBuilder
克隆的问题。他是我的情况,我需要运行3个单独的查询,所有查询都基于单个" BaseQuery":
$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个where语句。将$query3 ... get()
替换为$query3 ... ->toSql();
会显示以下结果:
SELECT `column` FROM `models` WHERE `deleted_at` IS NULL AND `condition` = ? AND `condition2` = ? AND `condition3` = ?;
即使我将每个$queryX
定义为$baseQuery
的克隆,似乎还会将额外的->where()
子句应用于每个查询。我在尝试附加任何clone()
条款之前尝试过->where()
,但这并没有任何影响。
有没有办法clone()
某些东西,并确保它创建一个新实例?看起来clone()
并未将$baseQuery
与$queryX
分开,因此->where()
被应用于每个后续副本,即使每个应该< / em>是一个只有->whereNull()
子句的新查询。
另一个有趣的观点是运行
\Log::info($baseQuery == $queryX);
每次修改后返回true
(===
为false
)
答案 0 :(得分:1)
您应该在这里使用scopes。
本地范围允许您定义可在整个应用程序中轻松重复使用的常见约束集。例如,您可能需要经常检索所有被认为是#34;流行的用户&#34;。要定义范围,只需在Eloquent模型方法前加上范围
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();