Ankündigung

Einklappen
Keine Ankündigung bisher.

Many to Many Beziehung oder richtiger Ansatz?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Laravel] Many to Many Beziehung oder richtiger Ansatz?

    Hi Leute,
    das ganze ist eine kleine Konzeptionsfrage weil ich gerade nicht so wirklich 100% weiß ob ich auf dem Schlauch stehe oder das ganze richtig angehe.

    Und zwar: Es geht um ein ganz einfaches "subscriben" wie bei Twitter. Bedeutet: Ein User kann bei mehreren Personen abonnieren, andere können jedoch nur bei ihm abonnieren.

    Ich habe einerseits mein User Modell:

    PHP-Code:
      public function subscriptions()  {      return $this->hasMany('App\Subscription');  } 
    andererseits hab ich bei meinem Subscription Modell nur eine belongsTo Methode vernwendet, da jede Subscription ja auch nur EINEM bestimmten Profil zugeordnet wird. Meine Tabelle sieht folgendermaßen aus:

    id
    user_id
    sub_id

    Wobei die User ID mit dem jeweiligen aktiven Account in Verbindung steht und als Foreign Key verwendet wird.

    Eine Abfrage der Subscriptions findet dann in meinem Controller folgendermaßen statt:

    PHP-Code:
      $subs Auth::user()->subscriptions()->get()->all(); 
    Bei jedem Abfragen der Subscriptions muss ich also jeweils die beiden ID's dann zu den User Objekten umwandeln. Ich stehe gerade auf dem Schlauch:

    Ist das so Best-Practice? Könnte ich an der Struktur etwas verändern um es effizienter zu machen?

    Grüße,
    Fabian

  • #2
    hasManyTrough ist doch gut dokumentiert
    https://laravel.com/docs/5.2/eloquen...s-many-through
    https://www.rhofma.de mein Blog

    Kommentar


    • #3
      Das ist mir durchaus bewusst - die Dokumentation habe ich auch zur Rate gezogen - hilft mir aber nicht sonderlich viel wenn ich ne kleine Denkstütze brauch den Link zu posten den ich bereits zur Entwicklung genutzt habe

      Heißt ich müsste im Userobjekt das ganze auf hasManyThrough ändern, die dementesprechenden Keys angeben (weil sich ja BEIDE auf die Usertabelle beziehen und nicht auf unterschiedliche) und dann wär es optimaler als jetzt?

      Das Problem liegt ja daran das ich jetzt 2 Usermodelle habe und keine 2 unterschiedlichen.

      Kommentar


      • #4
        //DELTED:

        Denkfehler gehabt, ist natürlich ne n:m Beziehung, ich hol mir jetzt nen Kaffee ...
        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          Das Problem mit der manyThrough Methode ist ja auch das 2x das User Modell abgefragt werden muss. Kann es sein das ich einfach das falsche Datenbankdesign genutzt habe und für jede Subscription noch ein richtiges Model anlegen muss und quasi jede Subscription extra abspeichere und dann durch die pivot Tabelle diese nur verbinde?

          Weil momentan ists ja:

          subscriptions
          id
          user_id
          sub_id

          users
          id
          ...

          Das Ding ist ja das die "Subscription" an sich kein richtiges Modell darstellt (und auch keins existiert) sondern ich diesen Schritt quasi überspringen will und einfach nur die zugehörigen User die ihn subscribed haben direkt laden will.

          Kommentar


          • #6
            Ohne eine Zwischenentität, lässt sich n:m in einer relationalen Datenbank nicht vernünftig darstellen. Du modellierst dadurch ja zwei mal die 1:n Relation.
            Das User Modell musst du 2x abfragen. Einmal für den Abonnent und einmal für den Abonnierer. Im Hintergrund müsste da Eloquent (habe damit noch nicht richtig gearbeitet) einen Join machen, ergo eine DB-Abfrage.

            Allerdings kann Subscriptions auch als ein Modell dargestellt werden, wenn du noch weitere Meta Informationen speichern möchtest, wie z.B. Zeitpunkt der Subscription.
            "Software is like Sex, it's best if it's free." - Linus Torvalds

            Kommentar


            • #7
              Hab mich für die zweitere Variante entschieden und die Subscription als gesondertes Objekt angelegt. Danke für die Hilfe!

              Kommentar

              Lädt...
              X