Benutzer-Werkzeuge

Webseiten-Werkzeuge


laravel:belongstomany

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.

laravel/belongstomany.txt · Zuletzt geändert: 2019/10/08 20:57 von webproducer