Ошибка Laravel union 500 при назначении запроса - PullRequest
0 голосов
/ 23 октября 2019

Итак, у меня есть следующий код ...

$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

Я просто пытаюсь понять, почему произойдет ошибка, несмотря на то, что присвоение значения по сути является тем же объектом построителя запросов.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

У вас есть $second и $query, указывающие на один и тот же точный экземпляр Query Builder из-за назначения:

$second = $query;

Это не создает новую копию $query и присваивает ее $second;это назначение по ссылке. Чтобы скопировать объект, вы хотите клонировать Builder:

$second = clone $query;

Когда вы присваиваете результат DB::table(...) для $second, то есть назначается новый объект Builder. Когда вы выполняете прямое присвоение $second $query, вы в конечном итоге получаете эквивалентное выражение в конце:

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

Это создаст рекурсивный цикл, который я бы предположил, и убралпроцесс в конечном итоге.

PHP: операторы присваивания

PHP: клонирование объектов

1 голос
/ 23 октября 2019

Следующий запрос может быть идентичен вашей текущей попытке, и он намного проще:

$query = DB::table('recipes')
    ->where('status', 0)
    ->whereIn('type', ['x', 'y']);
    ->get();

Если по какой-то причине вы действительно хотите использовать объединение здесь, вам придется исправитьсинтаксис:

$first = DB::table('recipes')
        ->where('status', 0);
        ->where('type', 'x');

$second = DB::table('recipes')
        ->where('status', 0);
        ->where('type', 'y');
        ->union($first)
        ->get();

Обратите внимание, что вы действительно можете сделать здесь UNION ALL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...