Как создать запрос с несколькими условиями WHERE с использованием Laravel Eloquent?
Я использую построитель запросов Eloquent в Laravel и у меня есть запрос, в котором я хочу использовать условие WHERE
на нескольких условиях. Это работает, но выглядит не очень элегантно.
Пример:
$results = User::where('this', '=', 1)
->where('that', '=', 1)
->where('this_too', '=', 1)
->where('that_too', '=', 1)
->where('this_as_well', '=', 1)
->where('that_as_well', '=', 1)
->where('this_one_too', '=', 1)
->where('that_one_too', '=', 1)
->where('this_one_as_well', '=', 1)
->where('that_one_as_well', '=', 1)
->get();
Есть ли более подходящий способ сделать это, или мне стоит продолжать использовать этот метод?
5 ответ(ов)
Query-области (scope) могут помочь сделать ваш код более читаемым.
Подробнее можно ознакомиться в документации Laravel: Query Scopes.
Вот обновленный ответ с примерами:
В вашем модели создайте методы для областей, вот так:
public function scopeActive($query)
{
return $query->where('active', '=', 1);
}
public function scopeThat($query)
{
return $query->where('that', '=', 1);
}
Затем вы можете использовать эти области при построении вашего запроса:
$users = User::active()->that()->get();
Таким образом, использование query-областей позволяет вам писать более чистый и понятный код при работе с запросами к базе данных.
Вы можете использовать подзапросы в анонимной функции следующим образом:
$results = User::where('this', '=', 1)
->where('that', '=', 1)
->where(
function($query) {
return $query
->where('this_too', 'LIKE', '%fake%')
->orWhere('that_too', '=', 1);
})
->get();
В приведённом примере мы используем анонимную функцию для создания дополнительного условия в запросе. Это позволяет нам сгруппировать логические условия, чтобы запрос был более читаемым и понятным.
Ответ на ваш вопрос о создании условий для запросов в Eloquent ORM (Laravel) с использованием массива и анонимных функций выглядит следующим образом:
Условия с использованием массива:
$users = User::where([
'column1' => $value1,
'column2' => $value2,
'column3' => $value3
])->get();
Этот код сгенерирует SQL-запрос, который будет выглядеть следующим образом:
SELECT * FROM TABLE WHERE column1 = value1 AND column2 = value2 AND column3 = value3
Условия с использованием анонимной функции:
$users = User::where('column1', '=', $value1)
->where(function($query) use ($variable1, $variable2) {
$query->where('column2', '=', $variable1)
->orWhere('column3', '=', $variable2);
})
->where(function($query2) use ($variable1, $variable2) {
$query2->where('column4', '=', $variable1)
->where('column5', '=', $variable2);
})->get();
Этот код сгенерирует SQL-запрос такого вида:
SELECT * FROM TABLE WHERE column1 = value1 AND (column2 = value2 OR column3 = value3) AND (column4 = value4 AND column5 = value5)
Таким образом, в первом примере вы создаете простое условие с использованием массива, а во втором - более сложное с использованием анонимных функций, что позволяет вам гибко комбинировать условия. Это особенно полезно, если вам нужно использовать комбинацию "AND" и "OR" в ваших запросах.
В данном случае вы можете использовать что-то вроде этого:
User::where('this', '=', 1)
->whereNotNull('created_at')
->whereNotNull('updated_at')
->where(function($query) {
return $query
->whereNull('alias')
->orWhere('alias', '=', 'admin');
});
Это позволит вам сформировать запрос вида:
SELECT * FROM `user`
WHERE `user`.`this` = 1
AND `user`.`created_at` IS NOT NULL
AND `user`.`updated_at` IS NOT NULL
AND (`alias` IS NULL OR `alias` = 'admin')
Таким образом, вы получите необходимые записи пользователей, соответствующие заданным условиям.
В вашем вопросе вы привели несколько способов конструкций запросов в Laravel. Вот перевод:
Model::where('column_1', '=', 'value_1')
->where('column_2', '=', 'value_2')
->get();
ИЛИ
// Если вы ищете записи с равными значениями, то нет необходимости добавлять знак =
Model::where('column_1', 'value_1')
->where('column_2', 'value_2')
->get();
ИЛИ
Model::where(['column_1' => 'value_1',
'column_2' => 'value_2'])->get();
Если у вас возник вопрос о том, какой способ использовать, все три варианта корректны, но второй и третий являются более лаконичными. В большинстве случаев рекомендуется использовать второй вариант для простоты, так как он не требует явного указания оператора сравнения '='. Третий вариант хорош для случаев, когда вы хотите передать условия в виде массива, что делает код более читаемым и удобным для добавления дополнительных условий.
Как вывести сырой SQL-запрос в виде строки из билдера запросов?
Как удалить пакет из Laravel с помощью PHP Composer?
Как создать пользовательские вспомогательные функции в Laravel
Что такое потокобезопасность и непотокобезопасность в PHP?
Вставка нового элемента в массив в любом месте в PHP