Suppose I have a Conversation
model like this :
class Conversation extends Model
{
public function questions (){
return $this->hasMany('AppQuestion','conversation_id','conversation_id');
}
public function category ()
{
return $this->belongsTo('AppCategory', 'cat', 'cat_id');
}
}
And a Question
model like this:
class Question extends Model
{
public function conversation ()
{
return $this->belongsTo('AppConversation', 'conversation_id', 'conversation_id');
}
}
As you can see there is a hasMany
relation between those two.
In the other hand there is a Category
like below that has a relation with Conversation
model :
class Category extends Node
{
public function conversations (){
return $this->hasMany('AppConversation','cat','cat_id');
}
}
Now I want to append an attribute named question_count
to Category
that counts all questions of conversations of each category. for that I added this :
public function getQuestionsCountAttribute ()
{
return $this->conversations->questions->count();
}
But when fetch a category I got this error :
ErrorException in Category.php line 59:
Undefined property: IlluminateDatabaseEloquentCollection::$questions
What did I do? how can I count relations of a relation with minimum server overloading?
I am using laravel 5.3.4.
I think that you need a has many through relationship here.
What you do wrong:
When you write
$this->conversations->questions
, this can't work, because thequestions
are a relation of a single conversation and not of a collection of conversations (here,$this->conversations
is a Collection)The solution:
Using hasManyThrough relation:
You can find the documentation for this relation on this page, if my explanation is bad
The basics are, you need to define a relation on your
Category
model:(I will let your look into the documentation for your non standards foreign keys)
You should then be able to use:
$category->questions->count()