Laravel éloquent - empêche le remplacement des valeurs lors de la jointure de tables
Question
Ok, j'ai donc les deux modèles suivants : Account
et Role
class Account extends Eloquent
{
protected $table = 'account';
/* [...] */
public function group() {
return $this->belongsTo('Group');
}
}
et
class Role extends Eloquent {
protected $table = 'role';
public function accounts() {
return $this->hasMany('Account');
}
}
et les tables de la base de données : account
et role
account
-------
id
name
role_id (nullable)
role
----
id
name
Et maintenant le truc c'est :
je dois commander accounts
par role.name
colonne.Mais après la jointure (ou leftJoin), les valeurs sont remplacées par celles de la deuxième table.Voici un peu de code :
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
Après cela, les valeurs pour id
et name
sont incorrects dans les collections éloquentes.
De plus, j'ai besoin que le retour soit des modèles de type éloquents car je renvoie la réponse en JSON, où il est important que plus tard dans JS (après avoir analysé JSON), je puisse le faire simplement account.role.name
.
Changer les noms des champs dans les tableaux (comme :id -> account_id, et :id -> role_id) serait une solution de contournement, mais ce n'est pas mon cas - il faut que la clé primaire soit nommée id
pour chaque table.
modifier] oui, donc la question est simplement:comment résoudre ce problème ?
La solution
Vous pouvez utiliser « select » comme vous le feriez dans une requête SQL normale :
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
Autres conseils
Complétant la réponse donnée par @hêtre, vous pouvez utiliser un alias dans votre clause select, de cette façon vous pouvez récupérer uniquement les clés spécifiques dont vous avez besoin, par exemple.
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();