Laravel Eloquent Lazy Eager Load Count

edl*_*uth 26 laravel eloquent

我理想地寻找像这样的功能

load('relationship')
Run Code Online (Sandbox Code Playgroud)

但是以相同的方式加载计数

withCount('relationship')
Run Code Online (Sandbox Code Playgroud)

适用于急切加载.

我想它会被称为 loadCount('relationship')

rzb*_*rzb 24

从Laravel 5.2开始,此功能是内置的.

如果Post和Comment之间有hasMany关系,请执行以下操作:

<?php

$posts = App\Post::withCount('comments')->get();

foreach ($posts as $post) {
    echo $post->comments_count;
}
Run Code Online (Sandbox Code Playgroud)

通过在模型中声明这一点,您甚至可以默认计算加载关系计数:

<?php

// Post model

protected $withCount = ['comments'];
Run Code Online (Sandbox Code Playgroud)

  • 这都是真的,但是我一直在寻找延迟加载([参见](https://laravel.com/docs/5.5/eloquent-relationships#lazy-eager-loading)),即能够在之后加载计数该模型已被检索。 (2认同)
  • @shigg除了它不是懒惰加载任何东西.计数查询与主查询同时执行,这意味着它正在急切加载.正如我在上面演示的那样,默认支持哪种Laravel. (2认同)

小智 13

这个解决方案对我很有用:

在相关模型上创建新的hasOne关系,并将原始选择添加到计数的查询中.例如,如果您希望为给定用户急切加载任务数,请将其添加到用户模型:

public function taskCount()
{
    return $this->hasOne('App\Task')
    ->selectRaw('user_id, count(*) as count)
    ->groupBy('user_id');
}
Run Code Online (Sandbox Code Playgroud)

然后急切加载计数如下:

$user = User::where('email', $email)->with('taskCount)->first();
Run Code Online (Sandbox Code Playgroud)

并像这样访问计数:

$taskCount = $user->task_count->count;
Run Code Online (Sandbox Code Playgroud)

  • 是的 检查我的答案。 (2认同)

Mak*_*nov 10

loadCount()Laravel 5.8可用

$post->loadCount('comments');

$post->comments_count;
Run Code Online (Sandbox Code Playgroud)

文件