计算关系 laravel 中的关系
count relation of relation in laravel
假设我有一个像这样的 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
关系。
另一方面,有一个像下面这样的 Category
与 Conversation
模型有关系:
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。
您可以使用'withCount'方法计算相关模型。
https://laravel.com/docs/5.3/eloquent-relationships#counting-related-models
我认为你需要一个 has many through 关系。
你做错了什么:
当你写 $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()
$this->conversations 包含对话集合。每个对话都有自己的 questions 属性,其中包含该对话的所有相关问题,但是没有 questions 属性集合本身将包含该类别的所有相关问题。
为了能够获得该类别中所有问题的计数,您需要定义一个 hasManyThrough 关系,该关系将 link 个问题归入该类别直接。
首先,将关系添加到您的 类别 模型:
class Category extends Model {
public function questions() {
return $this->hasManyThrough('App\Question', 'App\Conversation', 'category_id', 'conversation_id', 'id');
}
}
一旦你有了它,你就可以得到一个类别的所有问题的数量:
public function getQuestionsCountAttribute ()
{
return $this->questions()->count(); // if you only need the counter
}
假设我有一个像这样的 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
关系。
另一方面,有一个像下面这样的 Category
与 Conversation
模型有关系:
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。
您可以使用'withCount'方法计算相关模型。 https://laravel.com/docs/5.3/eloquent-relationships#counting-related-models
我认为你需要一个 has many through 关系。
你做错了什么:
当你写 $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()
$this->conversations 包含对话集合。每个对话都有自己的 questions 属性,其中包含该对话的所有相关问题,但是没有 questions 属性集合本身将包含该类别的所有相关问题。
为了能够获得该类别中所有问题的计数,您需要定义一个 hasManyThrough 关系,该关系将 link 个问题归入该类别直接。
首先,将关系添加到您的 类别 模型:
class Category extends Model {
public function questions() {
return $this->hasManyThrough('App\Question', 'App\Conversation', 'category_id', 'conversation_id', 'id');
}
}
一旦你有了它,你就可以得到一个类别的所有问题的数量:
public function getQuestionsCountAttribute ()
{
return $this->questions()->count(); // if you only need the counter
}