Benutzer-Werkzeuge

Webseiten-Werkzeuge


laravel:belongstomany

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Both sides previous revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
laravel:belongstomany [2019/09/15 10:21]
webproducer Beispiel um Models erweitert
laravel:belongstomany [2019/10/08 20:57]
webproducer komplett neu erstellt
Zeile 1: Zeile 1:
-====== ​Beispiel für die Tabellenbeziehung 1:n (hasMany) ======+====== n:​m-Verknüpfung zwischen Tabellen ​(belongsToMany) ======
  
-In diesem Beispiel legen wir eine Tabelle Spielscheine und eine Tabelle Spielfelder an, wobei jedem Spielschein beliebig viele Spielfelder zugeordnet werden kann. +**Problemstellung:**
-Beim Anlegen ist die Reihenfolge wichtigZuerst den Spielschein,​ damit dieser bereits vorhanden ist wenn das Spielfeld auf auf den Spielschein referenziert.+
  
-===== Spielscheine ​=====+  * Ein Spielschein kann an mehreren Gewinnziehungen teilnehmen (z. B. 5 Wochen Laufzeit ​5 Ziehungen) 
 +  * An einer Gewinnziehung können mehrere ​Spielscheine ​teilgenommen haben
  
-==== Migration für "​Spielscheine"​ anlegen ====+**Lösung:​**
  
-<code php>php artisan make:migration create_spielscheine_table</​code>​+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.
  
-Wir erweitern die up-Funktion in der neu unter "​\dtabase\migrations"​ angelegte Datei:+**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'​ ) ->​default( 0 ); +
-            $table->​boolean( '​Super_6'​ ) ->​default( 0 ); +
-            $table->​boolean( '​GluecksSpirale'​ ) ->​default( 0 ); +
-            $table->​boolean( '​Plus_5'​ ) ->​default( 0 ); +
-            $table->​timestamps();​ +
-        }); +
-</​code>​+
  
-==== Model für "​Spielschein"​ anlegen ====+<​code>​php artisan make:​migration create_spielschein_ziehung_table</​code>​
  
-Wir erweitern die Klasse der neu angelegten Datei "App\Spielschein.php" ​um den Namen der Tabelle:+In der PHP-Klasse der Migration fügen wir die beiden Datenbankfelder ​"spielschein_id" ​und "​ziehung_id"​ hinzu
  
 <code php> <code php>
-    protected ​$table ​'​spielscheine';​ +public function up() 
- +
-    public function Spielfelder() + Schema::​create('​spielschein_ziehung',​ function (Blueprint ​$table) { 
-    { + $table->​integer( '​spielschein_id'​ )->​unsigned();​ 
-        return ​$this->hasMany( 'App\Spielfeld' ); + $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>​ </​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> 
 +class Spielschein extends Model 
 +
 +    protected $table = '​spielscheine';​
  
-<code php> +    ​public function ​Ziehungen()
-    ​public function ​up()+
     {     {
-        ​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'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_4'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_5'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_6'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_7'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_8'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_9'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Zahl_10'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Eurozahl_1'​ ) ->​nullable( true ) ->​default( NULL ); +
-            $table->​tinyInteger( '​Eurozahl_2'​ ) ->​nullable( true ) ->​default( NULL ); +
-        });+
     }     }
 +}
 </​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>​
  
-==== Model für "​Spielfelder"​ anlegen ====+**Verknüpfung zwischen den beiden Objekten erstellen**
  
-<code php>php artisan make:model Spielfeld</​code>​+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.
  
-Wir erweitern die Klasse der neu angelegten Datei "​App\Spielfeld.php" um den Namen der Tabelle:+<​code ​php>​$spielschein->​Ziehungen()->​save( $ziehung );</​code>​
  
-<code php>​protected $table = '​spielfelder';</​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