首页 > 解决方案 > 分配查询时 Laravel union 500 错误

问题描述

所以我有以下代码......

$query = DB::table('recipes');

// USING ONE OF THE FF STATEMENTS CHANGES THE OUTPUT
$second = DB::table('recipes'); // WORKS
$second = $query; // BREAKS AND RETURNS 500 ERROR

$query->where('status', 0);
$query->where('type', 'x');

$second->where('status', 0);
$second->where('type', 'y');

return $second->union($query)->toSql(); // toSql ONLY FOR DEBUG

我只是想弄清楚为什么尽管分配的值本质上是相同的查询构建器对象,但仍然会出错。

标签: phplaravel

解决方案


由于分配,您拥有$second$query指向相同的 Query Builder 实例:

$second = $query;

这不会创建新副本$query并将其分配给$second; 这是通过引用分配。要复制您想要克隆 Builder 的对象:

$second = clone $query;

当您分配结果时,将分配DB::table(...)一个$second新的 Builder 对象。当您对 to 进行直接分配时$second$query您最终会在结尾处得到等效的语句:

return $query->union($query)->toSql();

这将创建一个递归循环,我会假设并最终取消该过程。

PHP:赋值运算符

PHP:对象克隆


推荐阅读