Benutzer-Werkzeuge

Webseiten-Werkzeuge


laravel:belongstomany

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
laravel:belongstomany [2019/09/11 23:54]
webproducer angelegt
laravel:belongstomany [2019/10/08 20:57]
webproducer komplett neu erstellt
Zeile 1: Zeile 1:
-====== ​Beispiel für die Tabellenbeziehung 1:n (belongsToMany) ======+====== n:​m-Verknüpfung zwischen Tabellen ​(belongsToMany) ======
  
 +**Problemstellung:​**
  
-In diesem Beispiel legen wir eine Tabelle Spielscheine und eine Tabelle Spielfelder an, wobei jedem Spielschein ​beliebig viele Spielfelder zugeordnet werden ​kann. +  * Ein Spielschein kann an mehreren Gewinnziehungen teilnehmen (zB. 5 Wochen Laufzeit = 5 Ziehungen) 
-Beim Anlegen ist die Reihenfolge wichtig: Zuerst den Spielschein,​ damit dieser bereits vorhanden ist wenn das Spielfeld auf auf den Spielschein referenziert.+  * An einer Gewinnziehung können mehrere Spielscheine teilgenommen haben
  
-===== Spielscheine =====+**Lösung:​**
  
-==== Migration für "​Spielscheine"​ anlegen ====+Diese n:​m-Verknüpfung kann mit Hilfe einer sogenannte Pivot-Tabelle (Verknüpfungstabelle) realisiert werden. 
 +Hierbei können unbegrenzt viele Beziehungen zwischen Spielscheinen und Gewinnziehungen hergestellt werden.
  
-<code php>php artisan make:migration create_spielscheine_table</​code>​+**Vorgehensweise:**
  
-<code php> +Im ersten Schritt wird die Pivot-Tabelle mit Hilfe eines Artisan-Kommandos erstellt.
-    public function up() +
-    { +
-        Schema::​create('​spielscheine',​ function (Blueprint $table) { +
-            $table->​bigIncrements('​id'​);​ +
-            $table->enum( '​Spiel',​ array( '​Lotto',​ '​Eurojackpot',​ '​Keno',​ '​GlücksSpirale'​ ) ); +
-            $table->​string( '​Name',​ 50 ); +
-            $table->​string( '​Losnummer',​ 7 ); +
-            $table->​tinyInteger( '​Wochentage'​ ); +
-            $table->​boolean( '​Spiel_77'​ ); +
-            $table->​boolean( '​Super_6'​ ); +
-            $table->​boolean( '​GluecksSpirale'​ ); +
-            $table->​boolean( '​Plus_5'​ ); +
-            $table->​timestamps();​ +
-        }); +
-    } +
-</​code>​+
  
-==== Model für "​Spielschein"​ anlegen ====+<​code>​php artisan make:​migration create_spielschein_ziehung_table</​code>​
  
 +In der PHP-Klasse der Migration fügen wir die beiden Datenbankfelder "​spielschein_id"​ und "​ziehung_id"​ hinzu
  
-<code php>php artisan make:model Spielschein</​code>​+<code php> 
 +public function up() 
 +
 + Schema::​create('​spielschein_ziehung',​ function (Blueprint $table) { 
 + $table->​integer( '​spielschein_id'​ )->​unsigned();​ 
 + $table->​foreign( '​spielschein_id'​ )->​references( '​id'​)->​on( '​spielscheine'​)->​onDelete('​cascade'​);​ 
 + $table->​integer( '​ziehung_id'​ )->​unsigned();​ 
 + $table->​foreign( '​ziehung_id'​ )->​references( '​id'​)->​on( '​ziehungen'​)->​onDelete('​cascade'​);​ 
 + }); 
 +
 +</​code>​
  
-----+**Model für den "​Spielschein"​ anlegen**
  
-===== Spielfelder =====+<​code>​php artisan make:model Spielschein</​code>​
  
-==== Migration für "Spielfelder" ​anlegen ==== +Model um die Methode ​"belongsToMany" ​erweitern:
- +
-<code php>php artisan make:migration create_spielfelder_table</​code> ​+
  
 <code php> <code php>
-    ​public function ​up()+class Spielschein extends Model 
 +
 +    protected $table = '​spielscheine';​ 
 + 
 +    ​public function ​Ziehungen()
     {     {
-        ​Schema::​create('​spielfelder',​ function (Blueprint $table) { +        ​return ​$this->belongsToMany( 'App\Ziehung' );
-            $table->​bigIncrements('​id'​ ); +
-            $table->​bigInteger( '​spielschein_id'​ ) ->​unsigned();​ +
-            $table->​foreign( '​spielschein_id'​ ) -> references( '​id'​ ) -> on( '​spielscheine'​ ) -> onDelete( '​cascade'​ ); +
-            $table->​tinyInteger( '​Zahl_1'​ ); +
-            $table->​tinyInteger( '​Zahl_2'​ ); +
-            $table->​tinyInteger( '​Zahl_3'​ ); +
-            $table->​tinyInteger( '​Zahl_4'​ ); +
-            $table->​tinyInteger( '​Zahl_5'​ ); +
-            $table->​tinyInteger( '​Zahl_6'​ ); +
-            $table->​tinyInteger( '​Zahl_7'​ ); +
-            $table->​tinyInteger( '​Zahl_8'​ ); +
-            $table->​tinyInteger( '​Zahl_9'​ ); +
-            $table->​tinyInteger( '​Zahl_10'​ ); +
-            $table->​tinyInteger( '​Eurozahl_1'​ ); +
-            ​$table->tinyInteger( 'Eurozahl_2' ​); +
-        });+
     }     }
 +}
 </​code>​ </​code>​
  
-Wichtiger Hinweis: Die Spalte ​für den Fremdschlüssel muss vom gleichen Typ sein wie die Spalte in der Fremdtabelle:​ Wenn also die "​id"​ vom Typ "​bigIncrement"​ ist muss der Fremschlüssel vom Typ "​bigInteger"​ sein. Ist die "​id"​ hingegen vom Typ "​increments"​ muss der Fremdschlüssel mit "integer" ​angegeben werden.+**Model ​für die "Ziehung" ​anlegen**
  
-Weitere Erläuterungen zum Fremdschlüssel:+<​code>​php artisan make:model Ziehung</​code>​
  
 +Model um die Methode "​belongsToMany"​ erweitern:
  
-  * foreign = Fremdschlüssel zur Tabelle "​spielscheine",​ Tabellenspalte "​id"​ anlegen +<code php> 
-  * references = Name der Tabellenspalte +class Ziehung extends Model 
-  * on = Name der Tabelle +{ 
-  * onDelete ​Wenn der Spielschein ​geslöcht wird, werden automatisch auch alle zugehörigen Spielfelder gelöscht.+    ​protected $table ​'​ziehungen';​ 
 + 
 +    public function Spielscheine() 
 +
 + return $this->​belongsToMany( 'App\Spielschein' ); 
 +
 +
 +</​code>​
  
 +**Verknüpfung zwischen den beiden Objekten erstellen**
  
-==== Model für "​Spielfelder"​ anlegen ====+Um jetzt zwei Objekte (also einen Spielschein mit einer Ziehung) zu verknüpfen brauchen wir nur noch eine PHP-Zeile 
 +zu integrieren. Um den Eintrag in die Pivot-Tabelle kümmert sich Laravel im Hintergrund ganz automatisch.
  
-<code php>php artisan make:model Spielfeld</​code>​+<code php>$spielschein->​Ziehungen()->​save( $ziehung );</​code>​
  
 +Über die neuen von uns erstellten Funktionen "​Ziehungen()"​ und "​Spielscheine()"​ können wir im jeweils anderem Model die benötigten Daten aus der Datenbank auslesen.
laravel/belongstomany.txt · Zuletzt geändert: 2019/10/08 20:57 von webproducer