5

Как создать запрос с несколькими условиями WHERE с использованием Laravel Eloquent?

14

Я использую построитель запросов 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 ответ(ов)

1

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-областей позволяет вам писать более чистый и понятный код при работе с запросами к базе данных.

1

Вы можете использовать подзапросы в анонимной функции следующим образом:

$results = User::where('this', '=', 1)
       ->where('that', '=', 1)
       ->where(
           function($query) {
             return $query
                    ->where('this_too', 'LIKE', '%fake%')
                    ->orWhere('that_too', '=', 1);
            })
            ->get();

В приведённом примере мы используем анонимную функцию для создания дополнительного условия в запросе. Это позволяет нам сгруппировать логические условия, чтобы запрос был более читаемым и понятным.

0

Ответ на ваш вопрос о создании условий для запросов в 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" в ваших запросах.

0

В данном случае вы можете использовать что-то вроде этого:

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')

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

0

В вашем вопросе вы привели несколько способов конструкций запросов в 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();

Если у вас возник вопрос о том, какой способ использовать, все три варианта корректны, но второй и третий являются более лаконичными. В большинстве случаев рекомендуется использовать второй вариант для простоты, так как он не требует явного указания оператора сравнения '='. Третий вариант хорош для случаев, когда вы хотите передать условия в виде массива, что делает код более читаемым и удобным для добавления дополнительных условий.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь