2017-01-04 71 views
2

假設我有一個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_countCategory計數每個類別的對話的所有問題的屬性。爲此,我添加了這個:

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。

回答

2

我認爲你需要一個有很多通過關係在這裏。

你做什麼錯:

當你寫$this->conversations->questions,這可不行,因爲questions單個對話,而不是對話(在這裏集合的關係,$this->conversations是一個Collection)

解決辦法:

使用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()

1

$ this->對話包含對話的集合。每個對話都有其自己的問題屬性,其中包含該對話的所有相關問題,但集合本身沒有問題屬性,該屬性將包含該類別的所有相關問題。

爲了能夠獲得該類別中所有問題的數量,您需要定義一個hasManyThrough關係,該關係將問題直接鏈接到類別。

首先,關係添加到您的類別型號:

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 
}