Laravel Eloquent «где» гарантирует заказ? - PullRequest
2 голосов
/ 19 марта 2019

Например, делает ли это:

Model::where('role', 'all')->orWhere('role','user')->first();

Всегда получать модель, где роль вначале 'all', потому что где () объявляется раньше, чем orWhere ()?

Илия не должен доверять этому и всегда проверять, если?

$foo = new Model;
$bar = $foo->where('role', 'all')->first();
if(empty($bar)){
    $bar = $foo->where('role','user')->first();
}

Или, может быть, лучшее решение?

Ответы [ 2 ]

6 голосов
/ 19 марта 2019

Нет, это не будет, и это не имеет никакого отношения к Laravel, просто так работает SQL.

Построитель запросов сгенерирует следующую инструкцию SQL:

SELECT * FROM Model WHERE `role` = 'all' OR `role` = 'user' LIMIT 1;

порядок, в котором вы получите строки, будет в том порядке, в котором они находятся в таблице Model.Если вы хотите отсортировать строки, вам нужно применить к запросу порядок, например:

Model::where('role', 'all')
    ->orWhere('role','user')
    ->orderByRaw('CASE role WHEN \'all\' THEN 1 ELSE 2 END DESC')
    ->first();
1 голос
/ 19 марта 2019

Вы можете сделать что-то вроде этого:

Model::whereIn('role', ['all', 'user'])->get();

Если вы хотите заказать результаты и получить только первый, вы можете указать порядок следующим образом:

 Model::whereIn('role', ['all', 'user'])->orderBy('some_column', 'ASC')->first();

Но, конечно, выможно сделать так, как это:

Model::where('role', 'all')->orWhere('role','user')->orderBy('some_column', 'ASC')->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...