Laravel eloquent – verhindert das Überschreiben von Werten beim Verknüpfen von Tabellen
Frage
Ok, ich habe also folgende zwei Modelle: Account
Und Role
class Account extends Eloquent
{
protected $table = 'account';
/* [...] */
public function group() {
return $this->belongsTo('Group');
}
}
Und
class Role extends Eloquent {
protected $table = 'role';
public function accounts() {
return $this->hasMany('Account');
}
}
und Datenbanktabellen: account
Und role
account
-------
id
name
role_id (nullable)
role
----
id
name
Und jetzt ist die Sache:
Ich muss bestellen accounts
von role.name
Spalte.Aber nach dem Join (oder LeftJoin) werden die Werte durch diejenigen aus der zweiten Tabelle überschrieben.Hier ist ein Code:
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
Danach Werte für id
Und name
sind in beredten Sammlungen falsch.
Außerdem muss es sich bei der Rückgabe um eloquente Typmodelle handeln, da ich die Antwort in JSON zurückgebe, wobei es wichtig ist, dass ich später in JS (nach dem Parsen von JSON) genau das tun kann account.role.name
.
Namen von Feldern in Tabellen ändern (wie:id -> account_id, und:id -> role_id) wäre eine Problemumgehung, aber das ist nicht mein Fall – es muss ein Primärschlüssel benannt werden id
für jeden Tisch.
Bearbeiten] Ja, also ist die Frage einfach:Wie kann man dieses Problem lösen?
Lösung
Sie können „select“ wie in einer normalen SQL-Abfrage verwenden:
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
Andere Tipps
Ergänzend zur Antwort von @Buche, können Sie Alias in Ihrer Select-Klausel verwenden, um nur die spezifischen Schlüssel abzurufen, die Sie benötigen, z. B.
Account::with('role')
->select('account.id AS account_id', 'role.id AS role_id', 'account.name AS account_name', 'role.name AS role_name')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();