Метод loadCount
Метод loadCount применяется к уже полученной коллекции или экземпляру модели Eloquent и загружает количество записей для указанных отношений. В отличие от withCount, который загружает количество во время выполнения основного запроса, loadCount используется для ленивой загрузки подсчётов уже после того, как модели были получены. Это полезно, когда вы не знаете заранее, какие отношения вам понадобятся, или когда нужно дозагрузить подсчёты в уже существующую коллекцию.
Синтаксис
<?php
Model::loadCount($relations);
?>
Метод принимает один параметр - имя отношения или массив имён отношений. Возвращает те же модели, у которых теперь доступно свойство с суффиксом '_count'.
Пример
Предположим, у нас есть модель Post с отношением comments. Получим все посты, а затем загрузим количество комментариев к каждому посту:
<?php
use AppModelsPost;
$posts = Post::all();
$posts->loadCount('comments');
foreach ($posts as $post) {
echo "Post: " . $post->title . ", Comments: " . $post->comments_count;
}
?>
Результат выполнения кода:
["Post: article, Comments: 5", "Post: note, Comments: 3", "Post: story, Comments: 0"]
Пример
Метод loadCount позволяет загрузить количество для нескольких отношений одновременно, передав массив имён отношений:
<?php
namespace AppHttpControllers;
use AppModelsPost;
class PostController extends Controller
{
public function index()
{
$posts = Post::where('status', 'published')->get();
$posts->loadCount(['comments', 'likes']);
foreach ($posts as $post) {
echo $post->title . " - Comments: " . $post->comments_count . ", Likes: " . $post->likes_count;
}
}
}
?>
Результат выполнения кода:
["Article 1 - Comments: 5, Likes: 12", "Article 2 - Comments: 3, Likes: 8", "Article 3 - Comments: 0, Likes: 4"]
Пример
Метод loadCount можно использовать с условиями для подсчёта только определённых связанных записей, передавая массив с ключами-отношениями и значениями-замыканиями:
<?php
use AppModelsPost;
$posts = Post::where('status', 'published')->get();
$posts->loadCount([
'comments' => function ($query) {
$query->where('approved', true);
}
]);
foreach ($posts as $post) {
echo $post->title . " - Approved comments: " . $post->comments_count;
}
?>
Результат выполнения кода:
["Article 1 - Approved comments: 4", "Article 2 - Approved comments: 2", "Article 3 - Approved comments: 0"]
Пример
Метод loadCount можно применять к отдельной модели, чтобы загрузить количество для конкретной записи:
<?php
use AppModelsPost;
$post = Post::find(1);
$post->loadCount('comments');
echo "Comments count: " . $post->comments_count;
?>
Результат выполнения кода:
"Comments count: 5"
Смотрите также
-
метод
withCount,
который загружает количество связанных записей во время основного запроса -
метод
load,
который загружает сами связанные записи для уже полученных моделей -
метод
loadMissing,
который загружает только те отношения, которые ещё не были загружены -
метод
with,
который выполняет жадную загрузку связанных записей