Метод hasMany
Метод hasMany используется для определения отношения типа "один ко многим" между двумя моделями Eloquent. Он применяется в модели, которая находится на стороне "один" отношения. Первым параметром передаётся имя связанной модели, вторым - имя внешнего ключа в таблице связанной модели, третьим - имя локального ключа в текущей модели.
Метод возвращает экземпляр HasMany, который позволяет строить цепочки запросов к связанным моделям. Если второй и третий параметры опущены, Laravel автоматически определяет имена ключей по соглашениям: внешний ключ формируется как имя текущей модели в единственном числе с суффиксом '_id', а локальный ключ - 'id'.
Синтаксис
<?php
class ParentModel extends Model
{
public function relationName()
{
return $this->hasMany(ChildModel::class, 'foreign_key', 'local_key');
}
}
?>
Пример
Рассмотрим модели User и Post. Один пользователь может иметь много постов. Определим отношение:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
public function posts()
{
return $this->hasMany(Post::class, 'user_id', 'id');
}
}
?>
Теперь получим все посты пользователя с id равным 1:
<?php
use AppModelsUser;
$user = User::find(1);
$posts = $user->posts;
foreach ($posts as $post) {
echo $post->title;
}
?>
Результат выполнения кода:
["First post", "Second post", "Third post"]
Пример с использованием условий
К отношению можно применять дополнительные условия. Получим только опубликованные посты пользователя:
<?php
use AppModelsUser;
$user = User::find(1);
$posts = $user->posts()->where('status', 'published')->get();
foreach ($posts as $post) {
echo $post->title;
}
?>
Результат выполнения кода:
["First post", "Third post"]
Пример с созданием связанной модели
Метод hasMany позволяет создавать новые связанные модели через отношение. Создадим новый пост для пользователя:
<?php
use AppModelsUser;
use AppModelsPost;
$user = User::find(1);
$post = $user->posts()->create([
'title' => 'New post',
'content' => 'Content of new post',
'status' => 'draft'
]);
echo $post->title;
?>
Результат выполнения кода:
"New post"
Пример с подсчётом связанных моделей
Используем метод withCount для получения количества постов каждого пользователя:
<?php
use AppModelsUser;
$users = User::withCount('posts')->get();
foreach ($users as $user) {
echo "User $user->id has $user->posts_count posts";
}
?>
Результат выполнения кода:
["User 1 has 3 posts", "User 2 has 1 posts", "User 3 has 0 posts"]
Смотрите также
-
метод
hasOne,
который определяет отношение "один к одному" -
метод
belongsTo,
который определяет обратное отношение "один ко многим" -
метод
hasManyThrough,
который определяет "сквозное" отношение "один ко многим" -
метод
get,
который выполняет запрос и возвращает коллекцию