Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
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 wichtig: Zuerst 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. |