Метод belongsTo
Метод belongsTo применяется в моделях Eloquent для определения
отношения, когда одна модель принадлежит другой. Например, модель
Article принадлежит модели User, а модель
Comment принадлежит модели Article. Первым параметром
передаётся имя связанной модели, вторым - внешний ключ (по умолчанию
используется имя метода с суффиксом _id), третьим - локальный ключ
(по умолчанию id).
Синтаксис
<?php
Model::class
?>
Определение отношения в модели:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
?>
Использование отношения в коде:
<?php
$article = Article::find(1);
$user = $article->user;
echo $user->name;
?>
Результат выполнения кода:
"John Doe"
При стандартной настройке предполагается, что таблица articles
имеет внешний ключ user_id, который ссылается на поле
id в таблице users.
Пример с указанием внешнего ключа
Если внешний ключ отличается от стандартного имя_метода_id,
его можно передать вторым параметром:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
public function author()
{
return $this->belongsTo(User::class, 'author_id');
}
}
?>
Теперь отношение использует поле author_id вместо
user_id. Получить автора статьи:
<?php
$article = Article::find(1);
$author = $article->author;
echo $author->email;
?>
Результат выполнения кода:
"john@example.com"
Пример с указанием локального ключа
Если связанная модель использует нестандартный локальный ключ, его можно передать третьим параметром:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'uuid');
}
}
?>
В этом случае внешний ключ user_id связывается с полем
uuid в таблице users. Пример использования:
<?php
$article = Article::find(2);
$user = $article->user;
echo $user->uuid;
?>
Результат выполнения кода:
"550e8400-e29b-41d4-a716-446655440000"
Пример с использованием в запросе
Метод belongsTo также можно использовать в запросах
для фильтрации через отношение:
<?php
use AppModelsArticle;
$articles = Article::whereHas('user', function ($q) {
$q->where('active', true);
})->get();
foreach ($articles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3"]
Смотрите также
-
метод
hasOne,
который определяет отношение "один к одному" -
метод
hasMany,
который определяет отношение "один ко многим" -
метод
belongsToMany,
который определяет отношение "многие ко многим" -
метод
morphTo,
который определяет полиморфное отношение