РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
179 of 1392 menu

Метод 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,
    который выполняет запрос и возвращает коллекцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить