Laravel Where

Источник: «Laravel Where»
В Laravel очень мощный конструктор запросов. Он предлагает богатый набор методов, позволяющих легко и просто писать SQL-запросы.

Одним из таких методов является метод Where, и он имеет множество способов упрощения сложных запросов.

Простейший способ использования where — просто статически вызвать его в модели как Model::where('name', 'Ahmed')->first().

Конструктор запросов

Прежде всего, необходимо понять, что where и все его братья и сестры живут в классе Builder. И когда вы вызываете статический метод на модели. В большинстве случаев он будет перенаправлен в конструктор запросов Eloquent.

public static function __callStatic($method, $parameters)
{
return (new static)->$method(...$parameters);
}
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement', 'incrementQuietly', 'decrementQuietly'])) {
return $this->$method(...$parameters);
}

if ($resolver = $this->relationResolver(static::class, $method)) {
return $resolver($this);
}

if (Str::startsWith($method, 'through') &&
method_exists($this, $relationMethod = Str::of($method)->after('through')->lcfirst()->toString())) {
return $this->through($relationMethod);
}

return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}

Функция forwardCallTo переадресует вызов метода на функцию $this->newQuery(), возвращающую экземпляр класса Builder

/**
* Get a new query builder for the model's table.
*
* @return \Illuminate\Database\Eloquent\Builder
*/

public function newQuery()
{
return $this->registerGlobalScopes($this->newQueryWithoutScopes());
}

Итак, если посмотреть на метод where в классе Builder, то он занимает около 100 строк. Это связано с тем, что он может обрабатывать множество вариантов. Давайте рассмотрим их по очереди.

Простое условие where

Первый простой способ написать условие в Laravel — это передать ключ и значение в where.

User::where('email', 'root@admin.com')->first()

Это транслируется в:

SELECT * FROM users WHERE `email` = 'root@admin.com' LIMIT 1

Несколько where

Цепочка where

Также можно составить цепочку из нескольких where:

User::where('email', 'root@admin.com')
->where('is_active', true)->first()

Она транслируется в:

SELECT * FROM users WHERE `email` = 'root@admin.com' AND `is_active` = true LIMIT 1

Массив where

Другой способ сделать это — использовать массив where:

User::where([
'email' => 'root@admin.com',
'is_active' => true
])->first()

Он транслируется в:

SELECT * FROM users WHERE `email` = 'root@admin.com' AND `is_active` = true LIMIT 1

Использование OrWhere

Метод OrWhere используется для добавления в запросы ограничения OR. Он функционирует аналогично методу where, но добавляет условие в виде предложения OR, а не AND.

User::where('email', 'root@admin.com')
->orWhere('username', 'admin')->first()

Но как нам сделать is_active, если мы используем OR?

Сгруппированные условия

Мы можем использовать сгруппированные условия, передавая замыкание в метод where:

User::where(function($q) {
$q->where('email', 'root@admin.com')
->orWhere('username', 'admin');
})
->where('is_active', true)
->first()

И это транслируется в:

SELECT
*
FROM `users`
WHERE (`email` = 'root@admin.com' or `username` = 'admin')
AND `is_active` = 1

LIMIT 1

При этом можно иметь сколько угодно вложенных групп.

when и where

Вы также можете применять определённые wheres только тогда, когда условие when истинно:

$onlyActive = true;

User::where('email', 'root@admin.com')
->when($onlyActive, function($q) {
$q->where('is_active', true);
})->first()

Параметр where is_active = true будет применяться только в том случае, если параметр $onlyActive равен true.

Сокращения

Существуют также некоторые сокращения, которые можно применить для упрощения процесса написания запросов Eloquent.

Where{Столбец}

User::whereEmail('root@admin.com')->first()

Транслируется в:

SELECT * FROM `users` WHERE `email` = 'root@admin.com' LIMIT 1

Where{Столбец}And{Столбец}

User::whereEmailAndStatus('root@admin.com','active')->first()

Транслируется в:

SELECT * FROM `users` WHERE `email` = 'root@admin.com' AND `status` = 'active' LIMIT 1

Where{Столбец}Or{Столбец}

User::whereEmailOrUserName('root@admin.com','admin')->first()

Транслируется в:

SELECT * FROM `users` WHERE `email` = 'root@admin.com' OR `user_name` = 'admin' LIMIT 1

WhereNull

Можно также искать записи, в которых значение столбца равно null

User::whereNull('confirmed_at')->get()
SELECT * FROM `users` WHERE `confirmed_at` IS NULL

WhereNot

Существует также WhereNot для применения в запросах условия "NOT EQUAL TO".

User::whereNot('status','active')->all()

Транслируется в:

SELECT * FROM `users` WHERE NOT `status` = 'active'

WhereNotNull

Комбинация двух предыдущих:

User::whereNotNull('confirmed_at')->all()

Транслируется в:

SELECT * FROM `users` WHERE `confiremd_at` IS NOT NULL

Заключение

Мы вместе проверили, как можно использовать метод where. Сообщите мне в комментариях, если у вас есть какие-либо советы или рекомендации, или, возможно, упущены случаи, о которых я не рассказал.

Дополнительные материалы

Предыдущая Статья

Советы по оптимизации производительности Nginx

Следующая Статья

Как отправить e-mail с Laravel используя Gmail