Гарантирует ли Laravel красноречивый порядок ‘where’?

#sql #laravel #eloquent

#sql #laravel #красноречивый

Вопрос:

Например, гарантирует ли это:

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

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

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

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

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

Ответ №1:

Нет, это не так, и это не имеет ничего общего с 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();
  

Ответ №2:

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

 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();