关于hasMany的withCount()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于hasMany的withCount()相关的知识,希望对你有一定的参考价值。

我正试图在关系的关系上使用withCount()。我得到的错误是Method IlluminateDatabaseQueryBuilder::forums.threads does not exist.

鉴于这些模型:

class Category extends Model
{
    public function forums()
    {
        return $this->hasMany('AppForum');
    }
}

class Forum extends Model
{
    public function category()
    {
        return $this->belongsTo('AppCategory');
    }

    public function threads()
    {
        return $this->hasMany('AppPost')->orderByDesc('created_at');
    }
}

在我的控制器中考虑以下内容:

public function index()
{
    $categories = Category::with('forums')->withCount('forums.threads')->orderBy('order')->get();

    return view('home', compact('categories'));
}

以下是我的观点:

@foreach($categories as $category)
    {{ $category->title }}<br>
        @foreach($category->forums as $forum)
            {{ $forum->title }}<br>
            {{ $forum->threads_count }}
        @endforeach
@endforeach

我知道我可以简单地从控制器中删除withCount并使用$forum->threads->count(),但是可以按照我想要的方式查询计数吗?

如果是这样,怎么样?我希望通过加载计数尽可能快地加载计数(当然不加载所有实际的threads)。

答案

withCount()中尝试closure

$categories = Category::with(['forums'=>function($q){
       $q->withCount('threads');
    }])->orderBy('order')->get();
另一答案

你不需要加载你可以使用的线程$forum->threads()->count()它将返回线程的数量而不加载它们

以上是关于关于hasMany的withCount()的主要内容,如果未能解决你的问题,请参考以下文章

withCount() 用于多个级别?

如何检查模型是不是有偶数条相关记录?

Laravel多个withCount在同一关系上

Laravel 对多个 withCount 结果求和

在 Laravel 的 withCount() 方法中使用 DISTINCT

groupBy withCount 闭包(Laravel 5.3.26)