2017-01-04 7 views
2

Angenommen, ich habe ein Conversation Modell wie folgt aus:Zählung Beziehung Beziehung in Laravel

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'); 
    } 

} 

Und ein Question Modell wie folgt aus:

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

Wie man dort sehen kann, ist ein hasMany Beziehung zwischen denen, zwei.

In der anderen Seite gibt es eine Category wie unten, dass eine Beziehung mit Conversation Modell hat:

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

Jetzt möchte ich ein Attribut anhängen question_count zu Category benannt, die alle Fragen der Gespräche jeder Kategorie zählt. für die ich hat dieses Bild:

public function getQuestionsCountAttribute() 
    { 
     return $this->conversations->questions->count(); 
    } 

Aber wenn eine Kategorie ich diesen Fehler bekam holen:

ErrorException in Category.php line 59: 
Undefined property: Illuminate\Database\Eloquent\Collection::$questions 

Was habe ich getan? Wie kann ich Relationen einer Relation mit minimaler Serverüberlastung zählen?

Ich benutze Laravel 5.3.4.

Antwort

2

Ich denke, dass Sie hier viele Beziehungen haben müssen.

Was Sie tun falsch:

Wenn Sie $this->conversations->questions schreiben, kann dies nicht funktionieren, weil die questions eine Beziehung von ein einziges Gespräch und nicht aus einer Sammlung von Gesprächen sind (hier $this->conversations ist eine Sammlung)

Die Lösung:

Mit hasManyThrough Beziehung:

Sie in der Dokumentation zu dieser Beziehung finden on this page, wenn meine Erklärung schlecht

Die Grundlagen sind, müssen Sie eine Beziehung auf Ihrem Category Modell definieren:

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

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

(Ich werde Ihre Blick in die Dokumentation für Ihre nicht-Standards Fremdschlüssel)

Sie sollten dann in der Lage sein zu verwenden: $category->questions->count()

1

Sie können verwandte Modelle mit der 'withCount' Methode zählen. https://laravel.com/docs/5.3/eloquent-relationships#counting-related-models

+0

das ist die richtige Antwort – vladko

+0

Ich glaube nicht, dass es ist, er will eine Beziehung einer Beziehung zählen, nicht nur eine Beziehung – Hammerbot

+0

Ich glaube nicht, dass es ist. Damit dies funktioniert, muss eine Beziehung zwischen Kategorie und Fragen definiert werden, und es gibt keine –

1

$ this-> Konversationen enthält die Sammlung von Konversationen.Jede der Konversationen hat ihre eigene Fragen Eigenschaft, die alle verwandten Fragen für diese Konversation enthält, jedoch gibt es keine Fragen Attribut für die Sammlung selbst, die alle verwandten Fragen für diese Kategorie enthalten würde.

Um die Anzahl aller Fragen in der Kategorie zu erhalten, müssen Sie eine hasManyThrough Beziehung definieren, die Fragen direkt mit der Kategorie verknüpfen würde.

Fügen Sie zunächst die Beziehung zu Ihrem Kategorie Modell:

class Category extends Model { 
    public function questions() { 
    return $this->hasManyThrough('App\Question', 'App\Conversation', 'category_id', 'conversation_id', 'id'); 
    } 
} 

Sobald Sie es haben, werden Sie in der Lage sein, die Anzahl aller Fragen für eine Kategorie erhalten mit:

public function getQuestionsCountAttribute() 
{ 
    return $this->questions()->count(); // if you only need the counter 
}