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