2017-06-19 4 views
0

Ich habe eine Website mit Bildern und Bilder können Tags haben. Viele Bilder können auch dasselbe Tag haben. So können 2 Bilder das Tag "malen" haben.Laravel/SQL sortieren nach Beliebtheit/Trending

Ich habe eine images Tabelle, eine tags Tabelle, und eine images_tag Pivot-Tabelle.

Die images_tag Tabelle enthält die Spalten: id, images_id, tag_id und created_at.

Was ich will, ist in der Lage, im Wesentlichen zu finden, welche Tags innerhalb, sagen wir, den letzten 72 Stunden Trend sind. , Die Top 3 am häufigsten verwendeten Tags

Dies bedeutet, dass ich eine Abfrage haben wollen, die

$trendingTags = ImagesTag::where('created_at', '>=', Carbon::now()->subHours(72)) 

und nimmt, sagen wir in den letzten 72 Stunden verwendet, um alle Tags nimmt. Also in diesem Fall

$trendingTags = ImagesTag::where('created_at', '>=', Carbon::now()->subHours(72)) 
->orderBy('tag_id most frequently used', 'desc') 
->take(3); 

Wie könnte ich das funktionieren lassen?

Edit:

Als Reaktion auf fubar Antwort, habe ich versucht, die folgenden:

Controller:

$trendingTags = Tag::selectRaw('tags.*, COUNT(image_tag.id) AS count') 
->join('image_tag', 'tags.id', '=', 'image_tag.tag_id') 
->where('created_at', '>=', Carbon::now()->subHours(72)) 
->orderBy('count', 'desc') 
->take(3); 

return view('home') 
>with('trendingTags', $trendingTags) 

Das bin ich den Fehler gab:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'commendme.image_tag' doesn't exist (SQL: select count(*) as aggregate from tags inner join image_tag on tags . id = image_tag . tag_id where created_at >= 2017-06-16 02:44:02 order by count desc limit 3)

So Ich habe versucht, den Code zu wechseln, um die images_ta widerzuspiegeln g Tabelle (statt image_tag, die ich vermute, ich ist ein Tippfehler auf fubar ist Teil), und ich habe einen anderen Fehler:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'count' in 'order clause' (SQL: select count(*) as aggregate from tags inner join images_tag on tags . id = images_tag . tag_id where created_at >= 2017-06-16 02:45:15 order by count desc limit 3) (View: C:\xampp\htdocs\series\commend-me\CommendMe\resources\views\home.blade.php)

EDIT 2:

New Fehler nach zuletzt fubar versucht out :

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'image_count' in 'order clause' (SQL: select count(*) as aggregate from tags inner join images_tag on tags . id = images_tag . tag_id where created_at >= 2017-06-16 02:55:17 group by tags . id order by image_count desc limit 3) (View: C:\xampp\htdocs\series\commend-me\CommendMe\resources\views\home.blade.php)

Antwort

3

ich aus Ihrer Erklärung bin zu raten, dass Sie tatsächlich wollen die Tag Modelle selbst, anstatt die Drehdaten.

Wenn ja, dann müssen Sie die tags Tabelle in den image_tag Tisch setzen, und dann die Anzahl Beziehungen zählen zwischen den images und tags Tabellen. Sobald Sie diesen Wert haben, bestellen Sie einfach danach.

$trendingTags = Tag::selectRaw('tags.*, COUNT(images_tag.id) AS image_count') 
    ->join('images_tag', 'tags.id', '=', 'images_tag.tag_id') 
    ->where('images_tag.created_at', '>=', Carbon::now()->subHours(72)) 
    ->groupBy('tags.id') 
    ->orderBy('image_count', 'desc') 
    ->take(3) 
    ->get(); 

bearbeiten

Als Reaktion auf die von OP geschrieben Fehler.

Ich bemerkte, dass die Join-Tabelle, die ich referenzierte, tatsächlich images_tag, nicht image_tag genannt wird. OP, es ist ein Laravel-Standard, bei der Benennung von Pivot-Tabellen einzelne Namen der Relationen in alphabetischer Reihenfolge zu verwenden. Ich habe jedoch meine Antwort geändert.

Ich bemerkte auch, dass ich die wichtige groupBy Anweisung verpasst hatte, die von SQL Aggregatorfunktionen benötigt wird.

Schließlich habe ich count in image_count umbenannt, falls MySQL dies als reserviertes Wort betrachtet.

Edit # 2

Ich habe dies in einem meiner Projekte nur getestet, und es funktionierte wie erwartet.

$categories = FaqCategory::selectRaw('faq_categories.*, COUNT(faq_faq_category.id) AS faq_count') 
    ->join('faq_faq_category', 'faq_categories.id', '=', 'faq_faq_category.faq_category_id') 
    ->groupBy('faq_categories.id') 
    ->orderBy('faq_count', 'desc') 
    ->take(3) 
    ->get(); 
+0

Danke für die Antwort. Leider gibt mir dein Code einige Fehler. Ich habe den Hauptbeitrag bearbeitet, um diese Fehler anzuzeigen. –

+0

@FelixMaxime - Ich habe meine Antwort aktualisiert. – fubar

+0

Versuchte es. Ein weiterer Fehler. Bearbeitete den Hauptbeitrag erneut. –