Abrufen aller morphedByMany-Beziehungen in Laravel Eloquent

Lesezeit: 3 Minuten

Benutzeravatar von Andrew Willis
Andreas Willis

In der Laravel-Dokumentation gibt es folgendes Beispiel zum Abrufen morphedByMany Beziehungen, die polymorphe Viele-zu-Viele-Beziehungen sind.

Laravel Many to Many polymorphe Beziehungsdokumentation

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

Benutzeravatar von iPaat
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:

     page |  Typ |  ID 1 |  Inhalt |  1 1 |  Parallaxe |  2 1 |  Inhalt |  3 1 |  Inhalt |  4 

    * 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


1405450cookie-checkAbrufen aller morphedByMany-Beziehungen in Laravel Eloquent

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy