2017-11-15 5 views
0

Ich brauche nur die Anzahl, will nicht die Ergebnisse abrufen oder Abfrage für jede Zeile jedes Mal durchführen. Deshalb möchte ich eifrig laden.

Ich habe 3 Tabellen wie folgt aus:Zähle aus hasManyThrough-Beziehung mit eifrigem Laden (brauche nur Count)

Admins 
    id 

Posts 
    id 
    admin_id 

Comments 
    id 
    user_id //nullable (null if comment from admin) 
    admin_id //nullable (null if comment from user) 
    news_id 

Jetzt möchte ich alle Beiträge von einem einzigen Server-Betreiber und alle Kommentare von dieser Stellen zählen abzurufen, ohne alle Kommentare für Beiträge abrufen, nur COUNT von Kommentaren, Mit eifrigen Laden, um n + 1 Abfrageproblem zu vermeiden;

Hier denke ich, dass wir eine Beziehung verwendet werden, machen sollte mit gespannter Laden wie folgt aus:

//admin model  
public function commentsCountRelation() 
     { 
      return $this->hasManyThrough(Comment::class, News::class, 'admin_id', 'news_id') 
       ->selectRaw('news_id, count(*) as count') 
       ->groupBy('news_id'); 

     } 

--Look Hier verwendete ich hasManyThrough Beziehung, weil news_id nicht in Admins Tabelle ist.

Dann sollte ich ein Attribut machen, die Zählung easyly zugreifen zu können, wie:

public function getCommentsCountAttribute() 
    { 
     return $this->commentsCountRelation->first()->count ?? 0; 
    } 

Zugriff es dann mag:

$admin = Admin::with('commentsCountRelation')->findOrFail($id); 
$admin->commentsCount; 

Aber es gibt immer null, warum ist das so?

//relation 
public function ordersCountRelation() 
    { 
     return $this->hasOne(Order::class)->selectRaw('user_id, count(*) as count') 
      ->groupBy('user_id'); 

    } 

//attribute 
public function getOrdersCountAttribute() 
    { 
     return $this->ordersCountRelation->count ?? 0; 
    } 

//Then accessed like: 
$user = User::with('ordersCountRelation')->find($id); 
$user->ordersCount; //return only count 

Jede Hilfe wird sehr geschätzt

werden

Antwort

2

gibt es keine Notwendigkeit für die Verwendung von hasManyThrough:

Folgende Arbeiten für hasMany & belongsTo, habe ich es auf meinem anderen Modellen wie verwendet.
nur einige Beziehungen und withCount Methode verwenden:

$admin->posts->withCount('comments')->get();

dann können Sie es mit Zugang: $comments_count

+0

ich nicht verstand. Die App hat mehrere Admins und alle von ihnen hat Beiträge. Jetzt brauche ich alle Beiträge von bestimmten Admin & alle Kommentare zählen für nur diese Beiträge, In Frage ich beschrieben Tabellenstruktur & ich brauche diesen Kommentar zählen, während ich mit 'Admin' Modell arbeiten, Können Sie mir bitte erklären, wie tue ich das ohne "hasManyThrough", da ich nicht für alle Posts, sondern nur für Posts von diesem Admin Zählungen bekommen möchte. Ich brauche das so (nach dem Schleifen) '$ admin-> post-> commentCount' Ich werde hoch schätzen, wenn Sie mir ein Codebeispiel geben oder kurz erklären – APu

+0

Relations:' Admin' hat 'hasMany' mit' Post 'hat' hasMany' mit 'Comment' – APu

+0

Ich denke auch, dass Ihre Methode nicht eifrig lädt, oder? Kannst du mir bitte sagen, was der Effizienzvorteil ist, indem du deine Erwähnung anstelle von $ admin-> post-> comments-> count() 'verwendest – APu

Verwandte Themen