Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
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 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:** |
+ | |||
+ | 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( 0 ); | + | |
- | $table->boolean( 'GluecksSpirale' ) ->default( 0 ); | + | |
- | $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. |