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

Метод with

Метод with применяется к запросу Eloquent и позволяет указать отношения, которые должны быть загружены вместе с основной моделью. Это решает проблему N+1 запросов, когда для каждой полученной модели выполняется отдельный запрос для загрузки связанных данных. Первым параметром передаётся имя отношения, вторым - опционально замыкание для дополнительной фильтрации.

Синтаксис

<?php Model::with($relations); ?>

Пример

Давайте загрузим все статьи вместе с их авторами:

<?php namespace App\Http\Controllers; use App\Models\Article; class ArticleController extends Controller { public function index() { $articles = Article::with('author')->get(); foreach ($articles as $article) { echo $article->title . ' - ' . $article->author->name; } } } ?>

Результат выполнения кода:

"article 1 - John Doe" "article 2 - Jane Smith" "article 3 - John Doe"

Пример

Давайте загрузим несколько отношений одновременно:

<?php namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function show() { $posts = Post::with(['author', 'comments', 'tags'])->get(); foreach ($posts as $post) { echo $post->title; echo 'Comments: ' . $post->comments->count(); } } } ?>

Результат выполнения кода:

"post 1 - Comments: 5" "post 2 - Comments: 3" "post 3 - Comments: 7"

Пример

Давайте загрузим вложенные отношения с помощью точечной нотации:

<?php namespace App\Http\Controllers; use App\Models\Order; class OrderController extends Controller { public function index() { $orders = Order::with('user.profile.city')->get(); foreach ($orders as $order) { echo $order->id . ' - ' . $order->user->profile->city->name; } } } ?>

Результат выполнения кода:

"1 - New York" "2 - Los Angeles" "3 - Chicago"

Пример

Давайте загрузим отношение с дополнительными условиями с помощью замыкания:

<?php namespace App\Http\Controllers; use App\Models\User; class UserController extends Controller { public function index() { $users = User::with(['posts' => function ($query) { $query->where('status', 'published')->latest(); }])->get(); foreach ($users as $user) { echo $user->name . ' has ' . $user->posts->count() . ' published posts'; } } } ?>

Результат выполнения кода:

"John Doe has 5 published posts" "Jane Smith has 3 published posts"

Смотрите также

  • метод load,
    который загружает отношение для уже существующей модели
  • метод withWhereHas,
    который загружает отношение и добавляет условие на его существование
  • метод loadMissing,
    который загружает отношение только если оно ещё не загружено
  • метод get,
    который выполняет запрос и возвращает коллекцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить