2017-12-18 5 views
5

Ich habe drei Tabellen: uploads, categories und eine many-to-many Tabelle namens category_upload.Auswahl von zehn Top-Kategorien basierend auf einer Spalte in einer anderen Tabelle mit beredten

den Tabellen wie folgt aussehen:

**categories** 

id 
name 

**uploads** 

id 
name 
downloads(integer) 

**category_upload** 

id 
category_id 
upload_id 

Jedes Mal, wenn ich ein Download „Upload“ der Wert in der Spalte Downloads von 1.

erhöht Was ich tun möchte, konnte aber nicht herauszufinden, wie man sogar beginnt, ist Top 10 Kategorien basierend auf der downloads Spalte in der uploads Tabelle zu wählen. Also, wenn die Summe der downloads Spalte die größte für alle Uploads von einer bestimmten Kategorie ist, sollte diese Kategorie Nummer eins sein und so weiter bis Nummer zehn.

Kann dies mit eloquent oder nur SQL erreicht werden und wie? Irgendwelche Tipps werden geschätzt!

Hier ist, wie ich habe meine Beziehungen in den Modellen ein:

Kategorie:

public function uploads(){ 
     return $this->belongsToMany('App\Upload'); 
    } 

Upload:

public function category(){ 
    return $this->belongsToMany('App\Category'); 
} 
+0

Beispieldaten und die gewünschten Ergebnisse würde wirklich helfen. Was ist zum Beispiel ein "Buch"? –

+0

@GordonLinoff Buch ist ein Upload, ich habe es korrigiert. –

Antwort

1
Select category_id, uploads 
From (
    Select category_id, SUM(downloads) as uploads 
    From uploads as u 
    Left join upload_category as uc on uc.id=u.upload_id 
    Left join category as c on c.id=uc.category_id 
    Group by category_id )as t 
    Order by uploads desc 
    Limit 10 
+0

Hallo, danke für die Antwort. Es funktionierte mit einigen kleineren Verbesserungen, hier ist, was ich geändert habe: Wählen Sie Name, lädt Von ( Wählen c.name, SUM (Downloads) als Uploads Von Uploads als INNER Join Kategorie_Upload als uc auf uc.upload_id = u.id INNER Join-Kategorien als c auf c.id = uc.category_id Gruppe von c.name) als t Sortieren nach uploads desc Limit 10 –

0

Ihr Category Modell

public function downloads() 
{ 
    return $this->hasMany('App\Upload','category_upload','category_id','upload_id'); 
} 

In Ihrem Controller (Catagory)

versuchen, diese

Category::select("*")->with(['downloads' => function($q){ 
    $q->oderBy('downloades','desc')->take(10)->get(); 
}) 
Verwandte Themen