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
laravel:belongstomany [2019/09/15 10:34]
webproducer Link zu Teil 2 ergänzt
laravel:belongstomany [2019/10/08 20:57] (aktuell)
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:​** 
 + 
 +Im ersten Schritt wird die Pivot-Tabelle mit Hilfe eines Artisan-Kommandos erstellt. 
 + 
 +<​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> <code php>
 public function up() public function up()
 { {
- Schema::​create('​spielscheine', function (Blueprint $table) { + Schema::​create('​spielschein_ziehung', function (Blueprint $table) { 
- $table->​bigIncrements('id')+ $table->​integer( 'spielschein_id' )->unsigned(); 
- $table->enum'​Spiel',​ array( '​Lotto',​ '​Eurojackpot',​ '​Keno',​ '​GlücksSpirale'​ ) ); + $table->​foreign( 'spielschein_id' )->references( 'id'​)->​on( 'spielscheine'​)->​onDelete('cascade'); 
- $table->​string( 'Name', 50 )+ $table->​integer( 'ziehung_id' )->unsigned(); 
- $table->string( 'Losnummer', 7 )+ $table->​foreign( 'ziehung_id' )->references'​id'​)->on( 'ziehungen'​)->​onDelete('​cascade'​);
- $table->tinyInteger( 'Wochentage' )+
- $table->boolean( 'Spiel_77' ​) ->​default( 0 ); +
- $table->​boolean( 'Super_6' ) ->default); +
- $table->​boolean( 'GluecksSpirale' ) ->default)+
- $table->boolean( 'Plus_5' ) ->default( 0 ); +
- $table->​timestamps();+
  });  });
 } }
 </​code>​ </​code>​
  
-==== Model für "​Spielschein"​ anlegen ​====+**Model für den "​Spielschein"​ anlegen**
  
-Wir erweitern ​die Klasse der neu angelegten Datei "App\Spielschein.php" ​um den Namen der Tabelle:+<​code>​php artisan make:model Spielschein</​code>​ 
 + 
 +Model um die Methode ​"belongsToMany" ​erweitern:
  
 <code php> <code php>
-protected $table = '​spielscheine';​ +class Spielschein extends Model
- +
-public function Spielfelder()+
 { {
- return $this->hasMany( 'App\Spielfeld' );+    protected $table = '​spielscheine';​ 
 + 
 +    public function Ziehungen() 
 +    { 
 +        ​return $this->belongsToMany( 'App\Ziehung' ); 
 +    }
 } }
 </​code>​ </​code>​
  
-----+**Model für die "​Ziehung"​ anlegen**
  
-===== Spielfelder =====+<​code>​php artisan make:model Ziehung</​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 Ziehung extends Model
 { {
- Schema::​create('​spielfelder',​ function (Blueprint ​$table) { +    protected ​$table ​'ziehungen'; 
- $table->​bigIncrements('id' ​)+ 
- $table->​bigInteger( '​spielschein_id'​ ) ->​unsigned();​ +    ​public function Spielscheine() 
- $table->​foreign'​spielschein_id' ​-> references( '​id'​ ) -> on( '​spielscheine'​ ) -> onDelete( '​cascade'​ ); + { 
- $table->​tinyInteger( '​Zahl_1'​ ); + return ​$this->belongsToMany( 'App\Spielschein' ); 
- $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. +**Verknüpfung zwischen den beiden Objekten erstellen**
- +
-Weitere Erläuterungen zum Fremdschlüssel:​ +
- +
- +
-  ​foreign = Fremdschlüssel zur Tabelle "​spielscheine",​ Tabellenspalte "​id"​ anlegen +
-  ​references = Name der Tabellenspalte +
-  ​on = Name der Tabelle +
-  ​onDelete = Wenn der Spielschein geslöcht wird, werden automatisch auch alle zugehörigen Spielfelder gelöscht. +
- +
- +
-==== Model für "​Spielfelder"​ anlegen ==== +
- +
-<code php>php artisan make:model Spielfeld</​code>​ +
- +
-Die in "​App\Spielfeld.php"​ neu erstellte Klasse muss lediglich um den Namen der Tabelle erweitert werden:+
  
-<code php>​protected $table = '​spielfelder';</​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.
  
-----+<code php>​$spielschein->​Ziehungen()->save( $ziehung );</​code>​
  
-  * [[laravel:​hasMany_example|Teil 2: Überprüfung,​ ob die Verknüpfung funktioniert]]+Ü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