php之Laravel 中关系的计数关系

qq78292959 阅读:23 2024-08-05 10:48:10 评论:0

假设我有一个这样的 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'); 
    } 
 
} 

还有一个像这样的 Question 模型:
class Question extends Model 
{ 
    public function conversation () 
    { 
        return $this->belongsTo('App\Conversation', 'conversation_id', 'conversation_id'); 
    } 
} 

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

另一方面,像下面这样的 CategoryConversation 模型有关系:
class Category extends Node 
{ 
    public function conversations (){ 
        return $this->hasMany('App\Conversation','cat','cat_id'); 
    } 
} 

现在我想将一个名为 question_count 的属性附加到 Category ,该属性计算每个类别对话的所有问题。为此,我添加了以下内容:
    public function getQuestionsCountAttribute () 
    { 
        return $this->conversations->questions->count(); 
    } 

但是当获取一个类别时,我收到了这个错误:
ErrorException in Category.php line 59: 
Undefined property: Illuminate\Database\Eloquent\Collection::$questions 

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

我正在使用 Laravel 5.3.4。

请您参考如下方法:

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

你做错了什么:

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

解决办法:

使用 hasManyThrough 关系:

如果我的解释不好,您可以找到此关系 on this page 的文档

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

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

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

然后你应该可以使用: $category->questions->count()


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号