Метод 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,
который выполняет запрос и возвращает коллекцию