关系中的withCount()hasMany

时间:2018-03-03 10:35:15

标签: php laravel eloquent

我试图在关系关系上使用withCount()。我得到的错误是Method Illuminate\Database\Query\Builder::forums.threads does not exist.

鉴于这些模型:

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

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

    public function threads()
    {
        return $this->hasMany('App\Post')->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)。

2 个答案:

答案 0 :(得分:3)

withCount()内尝试closure

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

答案 1 :(得分:-1)

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