2017-01-15 4 views
1

Auf meiner Website können Benutzer Bilder hochladen und Tags an diese Bilder anhängen.Abfrageergebnisse in Laravel kombinieren

Ich habe eine Bilder-Tabelle, eine Tag-Tabelle und eine Pivot-Tabelle images_tag.

Bilder können viele Tags haben und Tags können zu vielen Bildern gehören.

Ich möchte in der Lage sein, eine Liste aller Tags zu generieren, die ein Benutzer in seinen Bildern verwendet hat.

$imageIDs = Images::where('created_by', Auth::user()->id)->lists('id'); 

Das würde also eine Liste aller Bild-IDs erstellen, die ein Benutzer hochgeladen hat.

Was ich will, ist im Wesentlichen "foreach $ imageIDs, überprüfen Sie die Tabelle images_tag und für jedes Spiel gehen Sie in die Tags-Tabelle und holen Sie mir den Tagname Wert zurück."

Aber ich habe keine Ahnung, wie ich das machen würde.

Vielleicht eine foreach dann die Merge-Methode für alle Ergebnisse verwenden? Jede Hilfe wäre willkommen!

Antwort

1

Sie müssen whereHas() verwenden, um die Beziehung zu überprüfen:

$userTags = Tags::whereHas('images', function($q) { 
    $q->where('created_by', auth()->user()->id); 
})->get(); 

Dann einfach diese Daten an eine Ansicht übergeben:

return view('some.view', compact('userTags')); 

Und iterieren-Tags in einer Ansicht:

@foreach ($userTags as $tag) 
    {{ $tag->name }} 
@endforeach 
+1

Das funktioniert perfekt! Vielen Dank! –

1

Was Sie tun könnten, ist dies.

class Tag extends Model 
{ 
    public function images() 
    { 
     return $this->belongsToMany(Image::class); 
    } 
} 

class SomeController 
{ 
    public function someMethod() 
    { 
     $tags = Tag::with(['images' => function ($image) { 
      return $image->where('created_by', Auth::user()->id); 
     }])->select('id', 'tagname')->get(); 
     // these are your $tags 
    } 
} 

Sie sollten keine Abfrage innerhalb foreach() verwenden. Dann würde es N+1 problem ergeben. Was Sie stattdessen tun, ist eifrig laden mit with() Anweisung.

+0

Würde das nicht nur ein Ergebnis zurückgeben, anstatt viele? –

+1

Sie erhalten eine 'Sammlung'. '$ tag collection' enthält alle' tags', die Ihrer Suchanfrage entsprechen. https://laravel.com/docs/5.3/collections – Gayan

+0

Fair genug. So hatte ich bereits die ersten Funktionen, Bilder(), in meinem Tag-Modell macht das ganze zu viel. Ich bin mir jedoch nicht sicher, wie etwasMethod funktionieren würde. Ich bin immer noch ziemlich neu in Laravel. Wie würde ich diese Funktion in meinem Controller nennen, so dass ich die Ansicht mit $ tags zurückgeben könnte? –

Verwandte Themen