Laravel 5.3 — Query Builder, начинающийся с orWhere

Недавно Laravel выпустил версию 5.3.

Есть несколько инструкций по обновлению с 5.2 до 5.3 по следующей ссылке:
https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

Красноречивые области теперь уважают ведущие логические ограничения области видимости. Например, если вы начинаете свою область с ограничением orWhere, она больше не будет преобразована в обычное значение где. Если вы полагались на эту функцию (например, добавили несколько ограничений orWhere в цикле), вы должны убедиться, что первое условие является нормальным, где можно избежать любых проблем булевой логики.

Если ваши области действия начинаются с ограничений, никаких действий не требуется. Помните, что вы можете проверить свой запрос SQL, используя метод запроса toSql:

Это, кажется, усложняет ситуацию, и обновление только добавит к нему ограничения.

У нас есть внутренний пакет, и чтобы сделать код простым и максимально аккуратным, есть часть, которая основывается на запуске запроса с помощью orWhere () и использует это, а также концепцию замыкания внутри рекурсивного метода. Как вы знаете, рекурсивные методы лучше всего делать короткими и простыми.

В соответствии с замечанием об обновлении, оно наверняка потерпит неудачу на Laravel 5.3

Мне просто интересно, если кто-нибудь знает причину, почему это поведение удаляется?

Спасибо!

Обновить:

Я перенес нашу систему на Laravel 5.3. Я подтверждаю, что это касается только Eloquent Builder, но не Query Builder (ранее «Fluent Builder»).

Даже коммит (который является чертовски много изменений) только на Eloquent \ Builder.
https://github.com/laravel/framework/issues/14829

В любом случае, чтобы быть в безопасности, я рекомендую внести соответствующие изменения. Это то, что мы сделали, хотя мы знаем, что это не нарушило наш код (на сегодняшний день).

4

Решение

Я полагаю, что причина именно этого запроса на извлечение: https://github.com/laravel/framework/pull/12918

Кто-то хотел бы использовать такие области:

User::approved()->orActive();

и в этом случае, если orActive область действия определяется так:

public function scopeOrActive($q) {
return $q->orWhere('active',1)
}

а также approved область действия определяется так:

public function scopeApproved($q) {
return $q->where('approved',1)
}

В laravel 5.2 было бы разрешено:

where approved = 1 AND active = 1

и в Laravel 5.3 решено:

where approved = 1 OR active = 1

так что это имеет смысл, однако я никогда не использовал области, начиная с orWhere

6

Другие решения

Вот способ использования нескольких предложений orWhere с логическими значениями. Скажем, вы хотите запрос типа:

выберите * из пользователей, где active = 1 и (user_type = 1 или user_type = 2 или user_type = 3);

Но мы не всегда хотим, чтобы все user_types были в запросе, т.е. у нас есть некоторые логические значения, которые решают, какие из них должны присутствовать. Это может быть достигнуто так:

$includeOne = true;
$includeTwo = false;
$includeThree = true;
$query = User::where('active', 1)
->where(function($q) use ($includeOne, $includeTwo, $includeThree) {
$q->when($includeOne, function($query) {
return $query->orWhere('user_type', 1);
})
->when($includeTwo, function($query) {
return $query->orWhere('user_type', 2);
})
->when($includeThree, function($query) {
return $query->orWhere('user_type', 3);
});
})->get();
0

По вопросам рекламы [email protected]