namespace App;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
/**
* Get all of the posts that are assigned this tag.
*/
public function posts()
{
return $this->morphedByMany('App\Post', 'taggable');
}
/**
* Get all of the videos that are assigned this tag.
*/
public function videos()
{
return $this->morphedByMany('App\Video', 'taggable');
}
}
Wie würde ich eine Liste aller bekommen morphed Beziehungen in einer Abfrage / Sammlung, zum Beispiel posts und videosund dann, wenn ich später hinzufüge photos (oder so), das auch?
Hast du jemals eine Lösung gefunden?
– John Mellor
21. November 2016 um 16:18 Uhr
Das habe ich, aber ich habe den Code nicht, es war bei einem alten Job … was ich tat, war im Grunde, den Abfragegenerator zu verwenden, um die Ergebnisse zu erhalten und die Modelle mit den Daten in einer benutzerdefinierten Sammlungsklasse zu erstellen.
– Andreas Willis
21. November 2016 um 21:12 Uhr
iPaat
Ich benutze hier einen Trick:
Erstellen Sie ein Modell Taggable für Ihre Anschlusstabelle taggable und füge a hinzu hasMany Bezug auf die Tag Modell.
public function related()
{
return $this->hasMany(Taggable::class);
}
In deinem Taggable Modell erstellen a morphedTo Beziehung.
public function taggables()
{
return $this->morphTo();
}
Jetzt können Sie alle Modelle abrufen, die das Tag verwenden, indem Sie Folgendes aufrufen:
$tagged = Tag::with('related.taggables');
Ich glaube, das ist jetzt der beste Ansatz, um dieses Problem zu lösen.
– Andreas Willis
13. Januar 2020 um 16:57 Uhr
Ich habe eine gemacht Kern für das gesamte Setup + wie Sie auch die zugehörigen Artikel erhalten
– ctf0
21. Juli 2020 um 17:09 Uhr
Haben Sie daran gedacht, die “Vereinigungsfunktion” der Sammlungen zu verwenden, um alle verschiedenen Sammlungen zusammenzuführen, um alles abzurufen, was Sie brauchen?
class Tag extends Model
{
[...]
/**
* Get all of.
*/
public function morphed()
{
return $this->video->union($this->posts)->all();
}
}
Dies würde nicht für den Fall funktionieren, in dem ich später mehr gemorphte Elemente hinzufügte, obwohl es für den speziellen Fall, Videos und Beiträge zu erhalten, funktionieren würde.
– Andreas Willis
25. Mai 2017 um 18:14 Uhr
Wenn Sie ein neues Morphing hinzufügen, können Sie dieser Funktion eine ->Vereinigung hinzufügen. Natürlich nicht vollautomatisch, aber Sie müssen trotzdem einige Codezeilen in Ihr Modell ändern …
– Simone Cabrino
25. Mai 2017 um 19:07 Uhr
Das funktioniert nicht. Zum Beispiel: Ich habe ein Seitenmodell und verschiedene Modelle sind damit verbunden, wie Inhalt und Parallaxe. Ich habe einige verbundene Datensätze:
* Wenn ja $this->content->union($this->parallax)->all(); gibt drei Datensätze zurück: 1, 3, 4 * Wenn ja $this->parallax->union($this->content)->all(); gibt drei Datensätze zurück: 2, 3, 4
– faulenzen
1. Dezember 2019 um 22:03 Uhr
Sie sollten in der Lage sein, eine Beziehung zu Ihrer Tag-Klasse als solche hinzuzufügen
public function taggable()
{
return $this->morphedTo();
}
Dadurch wird die taggable_id und taggable_type verwendet, um das relevante Modell zu erhalten, an das es gebunden ist.
Das gilt für polymorphe Beziehungen, ich spreche speziell von morphedByMany-Beziehungen, bei denen es sich um eine polymorphe Viele-zu-Viele-Beziehung handelt. Ich werde die Frage aktualisieren, um das klarer zu machen.
– Andreas Willis
11. März 2016 um 21:41 Uhr
14054500cookie-checkAbrufen aller morphedByMany-Beziehungen in Laravel Eloquentyes
Hast du jemals eine Lösung gefunden?
– John Mellor
21. November 2016 um 16:18 Uhr
Das habe ich, aber ich habe den Code nicht, es war bei einem alten Job … was ich tat, war im Grunde, den Abfragegenerator zu verwenden, um die Ergebnisse zu erhalten und die Modelle mit den Daten in einer benutzerdefinierten Sammlungsklasse zu erstellen.
– Andreas Willis
21. November 2016 um 21:12 Uhr