So würde ich Ihr Projekt gestalten.
Ich glaube nicht, dass Sie sogar eine Pivot-Tabelle oder viele-zu-viele-Beziehung benötigen.
Hinweis: Aus Gründen der Klarheit und die Vermeidung von Verwechslungen mit den User
, werde ich Account
verwenden, um zu verweisen, was man ein Customer
nennen. Am Ende haben Sie customer account
in Ihren Kommentaren verwendet.
Sie haben eine Lieferung, die sich auf drei verschiedene Einheiten bezieht.Diese Entitäten werden jedoch durch dasselbe Datenmodell in Ihrer Datenbank repräsentiert: das Account
Modell.
Eine einfache Eins-zu-viele-Beziehung reicht aus.
Ein Konto kann viele Sendungen haben. Und die Sendung gehört ein Konto.
Jetzt, wie man den "Typ" der Beziehung hinzufügt? Wir brauchen keine Pivot-Tabelle, sondern fügen einfach eine weitere Eins-zu-Viele-Beziehung hinzu.
Ein Account as biller
können viele Sendungen haben, und die Sendung gehört zu einem biller
.
Ein Account as origin
kann viele Sendungen haben, und die Sendung gehört zu einem origin
.
Ein Account as destination
kann viele Sendungen haben, und die Sendung gehört zu einem origin
.
, hier zu erklären, ist ein Beispielcode:
Wir haben drei Modelle: User
, Account
und Shipment
die mit dem Schema Beginnen wir:
Schema::create('accounts', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Schema::create('shipments', function (Blueprint $table) {
$table->increments('id');
$table->string('from');
$table->string('to');
$table->unsignedInteger('biller_id');
$table->unsignedInteger('origin_id');
$table->unsignedInteger('destination_id');
$table->foreign('biller_id')
->references('id')->on('accounts');
$table->foreign('origin_id')
->references('id')->on('accounts');
$table->foreign('destination_id')
->references('id')->on('accounts');
$table->timestamps();
});
Wir haben drei Spalten, die auf die id
auf derverweisenTabelle.
Für die Modelle und die Beziehungen:
Konto Modell:
class Account extends Model
{
public function billerShipments()
{
return $this->hasMany(Shipment::class, 'biller_id');
}
public function originShipments()
{
return $this->hasMany(Shipment::class, 'origin_id');
}
public function destinationShipments()
{
return $this->hasMany(Shipment::class, 'destination_id');
}
public function users()
{
return $this->belongsToMany(User::class);
}
}
Versand Modell:
class Shipment extends Model
{
public function billerAccount()
{
return $this->belongsTo(Account::class, 'biller_id');
}
public function originAccount()
{
return $this->belongsTo(Account::class, 'origin_id');
}
public function destinationAccount()
{
return $this->belongsTo(Account::class, 'destination_id');
}
}
Beispiel eine Sendung
zu erstellen
$billerAccount = \App\Account::create(['name' => 'account b']);
$originAccount = \App\Account::create(['name' => 'account a']);
$destinationAccount = \App\Account::create(['name' => 'account c']);
$newShipment = \App\Shipment::create([
'from' => 'city 1',
'to' => 'city 2',
'biller_id' => $billerAccount->id,
'origin_id' => $originAccount->id,
'destination_id' => $destinationAccount->id,
]);
echo $billerAccount->billerShipments()->count(); // 1
echo $originAccount->originShipments()->count(); // 1
echo $destinationAccount->destinationShipments()->count(); // 1
echo $newShipment->billerAccount->name === $billerAccount->name; // 1
echo $newShipment->originAccount->name === $originAccount->name; // 1
echo $newShipment->destinationAccount->name === $destinationAccount->name; // 1
Für die Konto-Benutzer-Beziehungen kann es abhängig von Ihren Anforderungen viele-zu-viele oder eins-zu-viele sein.
kann sich ein Kunde in Ihre App einloggen? – lewis4u
@ lewis4u, ja das ist einer der letzten beabsichtigten Zwecke. – Matthew
Nun, das ist dein erster Fehler ... jeder, der sich in deine App einloggen kann, sollte in der Benutzertabelle sein. und dann erstellen Sie die Rollentabellen und weisen den Benutzern Rollen zu, das ist die beste Vorgehensweise. Ein Benutzer kann viele Sendungen haben, und jede Sendung gehört nur einem Benutzer. Das sollte deine erste Beziehung sein. Eine andere Beziehung ist offensichtlich: Ein Benutzer kann viele Rollen haben und jede Rolle gehört vielen Benutzern. Dieser würde mit einem Pivot-Tisch gemacht werden. – lewis4u