Метод owns()
, которого не хватает в Eloquent
Например, недавно Newton Job поделился методом owns()
, применяемым им во всех своих проектах. Этот метод прост, но в то же время удобен.
Drop this convenient `owns()` method in your User models and thank me later 💅
— Laracasts (@laracasts) 3 апреля 2025 г.
PS: It doesn't query the database.
// Newton pic.twitter.com/qAXgoCd1G0
Сначала рассмотрим сам метод.
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);
}
Самое замечательное в этом методе то, что он не обращается к базе данных. Он просто сравнивает идентификаторы моделей и соединение с базой данных, что делает его очень быстрым и эффективным.