Benutzer-Werkzeuge

Webseiten-Werkzeuge


laravel:hasmany

Beispiel für die Tabellenbeziehung 1:n (hasMany)

In diesem Beispiel legen wir eine Tabelle Spielscheine und eine Tabelle Spielfelder an, wobei jedem Spielschein beliebig viele Spielfelder zugeordnet werden kann. Beim Anlegen ist die Reihenfolge wichtig: Zuerst den Spielschein, damit dieser bereits vorhanden ist wenn das Spielfeld auf auf den Spielschein referenziert.

Spielscheine

Migration für "Spielscheine" anlegen

php artisan make:migration create_spielscheine_table

Wir erweitern die up-Funktion in der neu unter „\dtabase\migrations“ angelegte Datei:

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();
	});
}

Model für "Spielschein" anlegen

Wir erweitern die Klasse der neu angelegten Datei „App\Spielschein.php“ um den Namen der Tabelle:

protected $table = 'spielscheine';
 
public function Spielfelder()
{
	return $this->hasMany( 'App\Spielfeld' );
}

Spielfelder

Migration für "Spielfelder" anlegen

php artisan make:migration create_spielfelder_table
public function up()
{
	Schema::create('spielfelder', function (Blueprint $table) {
		$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 );
	});
}

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.

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

php artisan make:model Spielfeld

Die in „App\Spielfeld.php“ neu erstellte Klasse muss lediglich um den Namen der Tabelle erweitert werden:

protected $table = 'spielfelder';

laravel/hasmany.txt · Zuletzt geändert: 2019/10/08 16:18 von webproducer