Метод owns(), которого не хватает в Eloquent

Хотя Eloquent ORM в Laravel довольно мощный и покрывает основные потребности для большинства случаев использования, всегда будет чего-то не хватать. Другими словами, всегда найдётся функция, которая не нужна пока не понадобится.

Например, недавно Newton Job поделился методом owns(), применяемым им во всех своих проектах. Этот метод прост, но в то же время удобен.

Сначала рассмотрим сам метод.

class User extends Authenticatable
{
/**
* Определяет, владеет ли пользователь данной моделью.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $relation
* @return bool
*/

public function owns(Model $model, $relation = 'user'): bool
{
return $model->{$relation}()->is($this);
}
}

Как видите, метод owns() принимает в качестве аргументов модель и связь. Затем проверяет, совпадает ли связь модели и текущего пользователя. Если да, то возвращается true, в противном случае — false.

Вот как его можно использовать:

$user = User::find(1);
$order = Order::find(1);

if ($user->owns($order)) {
// Заказ принадлежит пользователю
} else {
// Заказ не принадлежит пользователю
}

Или можно указать другую связь.

$user->owns($book, 'author');

Его также можно использовать в политике, например, так:

// app/Policies/BookPolicy.php

public function update(User $user, Book $book): bool
{
return $user->owns($book);
}

Самое замечательное в этом методе то, что он не обращается к базе данных. Он просто сравнивает идентификаторы моделей и соединение с базой данных, что делает его очень быстрым и эффективным.

Комментарии


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

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

Более быстрая сортировка строк с Intl.Collator