Laravel eloquent – ​​verhindert das Überschreiben von Werten beim Verknüpfen von Tabellen

StackOverflow https://stackoverflow.com//questions/24018304

  •  21-12-2019
  •  | 
  •  

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?

War es hilfreich?

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

http://laravel.com/docs/queries#selects

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top