Метод withCount
Метод withCount применяется к запросу Eloquent
и позволяет получить количество связанных записей без
их фактической загрузки. Метод принимает имя отношения
в качестве первого параметра. Результат сохраняется
в атрибуте модели с суффиксом _count.
Это полезно при необходимости отобразить количество
комментариев, лайков или других связанных данных.
Синтаксис
<?php
Model::withCount($relation)->get();
?>
Пример
Давайте получим все посты с количеством комментариев к каждому из них:
<?php
namespace AppHttpControllers;
use AppModelsPost;
class PostController extends Controller
{
public function index()
{
$posts = Post::withCount('comments')->get();
foreach ($posts as $post) {
echo $post->title . ': ' . $post->comments_count . ' comments';
}
}
}
?>
Результат выполнения кода:
"First post: 5 comments"
"Second post: 3 comments"
"Third post: 0 comments"
Пример
Подсчитаем количество лайков для каждого поста:
<?php
namespace AppHttpControllers;
use AppModelsPost;
class PostController extends Controller
{
public function index()
{
$posts = Post::withCount('likes')->get();
foreach ($posts as $post) {
echo $post->title . ': ' . $post->likes_count . ' likes';
}
}
}
?>
Результат выполнения кода:
"First post: 10 likes"
"Second post: 7 likes"
"Third post: 2 likes"
Пример
Загрузим количество комментариев только для опубликованных постов с использованием дополнительных условий:
<?php
namespace AppHttpControllers;
use AppModelsPost;
class PostController extends Controller
{
public function index()
{
$posts = Post::where('status', 'published')
->withCount(['comments' => function ($query) {
$query->where('approved', true);
}])
->get();
foreach ($posts as $post) {
echo $post->title . ': ' . $post->comments_count . ' approved comments';
}
}
}
?>
Результат выполнения кода:
"First post: 4 approved comments"
"Second post: 2 approved comments"
"Third post: 0 approved comments"
Пример
Используем псевдоним для изменения имени атрибута с количеством записей:
<?php
namespace AppHttpControllers;
use AppModelsPost;
class PostController extends Controller
{
public function index()
{
$posts = Post::withCount([
'comments' => 'total_comments'
])->get();
foreach ($posts as $post) {
echo $post->title . ': ' . $post->total_comments . ' comments';
}
}
}
?>
Результат выполнения кода:
"First post: 5 comments"
"Second post: 3 comments"
"Third post: 0 comments"
Смотрите также
-
метод
with,
который загружает связанные записи -
метод
loadCount,
который загружает количество связанных записей для уже полученной модели -
метод
withExists,
который проверяет наличие связанных записей -
метод
withSum,
который подсчитывает сумму значений связанных записей