Laravel Where
Одним из таких методов является метод 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
. Сообщите мне в комментариях, если у вас есть какие-либо советы или рекомендации, или, возможно, упущены случаи, о которых я не рассказал.