====== n:m-Verknüpfung zwischen Tabellen (belongsToMany) ====== **Problemstellung:** * Ein Spielschein kann an mehreren Gewinnziehungen teilnehmen (z. B. 5 Wochen Laufzeit = 5 Ziehungen) * An einer Gewinnziehung können mehrere Spielscheine teilgenommen haben **Lösung:** 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. **Vorgehensweise:** Im ersten Schritt wird die Pivot-Tabelle mit Hilfe eines Artisan-Kommandos erstellt. php artisan make:migration create_spielschein_ziehung_table In der PHP-Klasse der Migration fügen wir die beiden Datenbankfelder "spielschein_id" und "ziehung_id" hinzu 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'); }); } **Model für den "Spielschein" anlegen** php artisan make:model Spielschein Model um die Methode "belongsToMany" erweitern: class Spielschein extends Model { protected $table = 'spielscheine'; public function Ziehungen() { return $this->belongsToMany( 'App\Ziehung' ); } } **Model für die "Ziehung" anlegen** php artisan make:model Ziehung Model um die Methode "belongsToMany" erweitern: class Ziehung extends Model { protected $table = 'ziehungen'; public function Spielscheine() { return $this->belongsToMany( 'App\Spielschein' ); } } **Verknüpfung zwischen den beiden Objekten erstellen** 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. $spielschein->Ziehungen()->save( $ziehung ); Ü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.