Laravel 中关系的计数关系

A.B*_*per 4 php laravel eloquent laravel-5 laravel-5.3

假设我有一个Conversation这样的模型:

class Conversation extends Model
{
    public function questions (){
        return $this->hasMany('App\Question','conversation_id','conversation_id');
    }
    public function category ()
    {
        return $this->belongsTo('App\Category', 'cat', 'cat_id');
    }

}
Run Code Online (Sandbox Code Playgroud)

和这样的Question模型:

class Question extends Model
{
    public function conversation ()
    {
        return $this->belongsTo('App\Conversation', 'conversation_id', 'conversation_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这hasMany两者之间存在关系。

另一方面,Category下面有一个与Conversation模型有关系的类似:

class Category extends Node
{
    public function conversations (){
        return $this->hasMany('App\Conversation','cat','cat_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想附加一个名为question_countto的属性,Category该属性计算每个类别的所有对话问题。为此,我添加了以下内容:

    public function getQuestionsCountAttribute ()
    {
        return $this->conversations->questions->count();
    }
Run Code Online (Sandbox Code Playgroud)

但是当获取一个类别时,我收到了这个错误:

ErrorException in Category.php line 59:
Undefined property: Illuminate\Database\Eloquent\Collection::$questions
Run Code Online (Sandbox Code Playgroud)

我做了什么?如何计算具有最小服务器过载的关系的关系?

我正在使用 Laravel 5.3.4。

Ham*_*bot 7

我认为你需要一个有很多的关系在这里。

你做错了什么:

当您编写时$this->conversations->questions,这是行不通的,因为它们questions单个对话的关系,而不是对话集合的关系(这里$this->conversations是一个集合)

解决方案:

使用 hasManyThrough 关系:

如果我的解释不好,您可以在此页面上找到此关系的文档

基础知识是,您需要在Category模型上定义一个关系:

class Category extends Node
{
    public function conversations ()
    {
        return $this->hasMany('App\Conversation');
    }

    public function questions ()
    {
        return $this->hasManyThrough('App\Question', 'App\Conversation');
    }
}
Run Code Online (Sandbox Code Playgroud)

(我会让您查看非标准外键的文档)

然后,您应该能够使用: $category->questions->count()