Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
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 (z. B. 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. |