2016-05-09 14 views
0

Hallo!Laravel eloquent: Suche anhand von Tags mit orderBy auf gefundenen Tags

Ich habe eine Beziehung: ManyToMany zwischen Tags und Schnipsel (über eine Pivot-Tabelle: snippet_tag).

Ich möchte eine Suche nach Tags auf Schnipsel Liste machen. Das Problem besteht darin, wie die Suchergebnisse nach der Anzahl der gefundenen Tags sortiert werden.

Hier ist mein Code:

 $tags = explode(" ", $tags); 
     $snippets = Snippet::whereHas('tags', function ($q) use ($tags, $tags_db_table) { 
      $q->WhereIn($tags_db_table.'.name', $tags); 
     })->paginate(10); 

Im Beispiel unten habe ich 4-Tags, die 5 Ergebnisse gab:

ersten Schnipsel: 1 Tag gefunden (grün-Tags)

2. Schnipsel: 3 Markierungen gefunden (grüne Markierungen)

3. Schnipsel: 2 Tags gefunden (grün-Tags)

4. Schnipsel: 2 Tags gefunden (grün-Tags)

5. Schnipsel: 2 Tags gefunden (grün-Tags)

Wie wird das zweite Snippet zuerst angezeigt (3 gefundene Tags) und das erste Ergebnis wird zuletzt angezeigt (1 Tag gefunden)

Danke!

Search by tags with eloquent

Antwort

0

Ich habe es endlich geschafft! Hier ist die Antwort, wenn Sie das gleiche Problem haben wie ich. Wenn Sie irgendwelche Optimierung haben, werde ich mich freuen zu wissen. Dank

<?php 
 

 
     $snippets = \DB::table('tags as t') 
 
        ->join('snippet_tag', 't.id', '=', 'snippet_tag.tag_id') 
 
        ->leftJoin('snippets as s', 's.id', '=', 'snippet_tag.snippet_id') 
 
        ->WhereIn('t.name', $tags) 
 
        ->select(['s.id', 's.title', \DB::raw('COUNT(og_t.id) AS found_tags_number')]) 
 
        ->groupBy('s.id') 
 
        ->orderBy('found_tags_number', 'DESC') 
 
        ->paginate(10); 
 

 
     foreach ($snippets as $k => $snippet) { 
 
      $snippets[$k]->tags = \DB::table('tags') 
 
            ->join('snippet_tag', 'tags.id', '=', 'snippet_tag.tag_id') 
 
            ->where('snippet_tag.snippet_id', '=', $snippets[$k]->id) 
 
            ->select('name') 
 
            ->get(); 
 
     }