Метод load
Метод load применяется к уже полученной коллекции или модели Eloquent и позволяет загрузить связанные отношения, которые не были подгружены при выполнении основного запроса. В отличие от метода with, который загружает отношения на этапе построения запроса, метод load работает с уже существующими объектами. Первым параметром передаётся имя отношения, которое нужно загрузить, вторым - опциональная функция для дополнительной настройки запроса отношения.
Синтаксис
<?php
Model::load($relations);
?>
Пример
Давайте сначала получим статьи без загрузки связанных данных, а затем подгрузим автора для каждой статьи:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
$articles->load('author');
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::where('status', 'published')->get();
$posts->load(['author', 'comments', 'category']);
foreach ($posts as $post) {
echo $post->title;
echo ' - ' . $post->author->name;
echo ' - ' . $post->comments->count() . ' comments';
}
}
}
?>
Результат выполнения кода:
"Post 1 - John Doe - 5 comments"
"Post 2 - Jane Smith - 3 comments"
"Post 3 - John Doe - 8 comments"
Пример
Давайте загрузим вложенное отношение с использованием точечной нотации:
<?php
namespace App\Http\Controllers;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
$users = User::limit(5)->get();
$users->load('posts.comments');
foreach ($users as $user) {
echo $user->name . ' has ' . $user->posts->count() . ' posts';
foreach ($user->posts as $post) {
echo ' - ' . $post->title . ' has ' . $post->comments->count() . ' comments';
}
}
}
}
?>
Результат выполнения кода:
"John Doe has 3 posts - Post 1 has 5 comments - Post 2 has 3 comments - Post 3 has 8 comments"
"Jane Smith has 2 posts - Post 4 has 2 comments - Post 5 has 4 comments"
"Mike Johnson has 4 posts - Post 6 has 1 comment - Post 7 has 6 comments - Post 8 has 3 comments - Post 9 has 2 comments"
Пример
Давайте загрузим отношение с дополнительными условиями с использованием второго параметра:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
class CommentController extends Controller
{
public function show()
{
$articles = Article::where('status', 'published')->get();
$articles->load(['comments' => function ($query) {
$query->where('is_active', true)
->orderBy('created_at', 'desc')
->limit(3);
}]);
foreach ($articles as $article) {
echo $article->title . ' - recent comments: ' . $article->comments->count();
}
}
}
?>
Результат выполнения кода:
"article 1 - recent comments: 3"
"article 2 - recent comments: 3"
"article 3 - recent comments: 3"
Смотрите также
-
метод
with,
который загружает отношения на этапе построения запроса -
метод
loadMissing,
который загружает только отсутствующие отношения -
метод
get,
который выполняет запрос и возвращает коллекцию моделей -
метод
withCount,
который добавляет количество связанных моделей к результату