Laravel eloquent - evita a substituição de valores ao unir tabelas
Pergunta
Ok, então eu tenho os seguintes dois modelos: Account
e Role
class Account extends Eloquent
{
protected $table = 'account';
/* [...] */
public function group() {
return $this->belongsTo('Group');
}
}
e
class Role extends Eloquent {
protected $table = 'role';
public function accounts() {
return $this->hasMany('Account');
}
}
e tabelas de banco de dados: account
e role
account
-------
id
name
role_id (nullable)
role
----
id
name
E agora a questão é:
Eu preciso fazer um pedido accounts
por role.name
coluna.Mas após o join (ou leftJoin) os valores são substituídos pelos da segunda tabela.Aqui está um código:
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
Depois disso valores para id
e name
estão incorretos em coleções eloquentes.
Além disso, preciso que o retorno seja de modelos do tipo eloquente, pois estou retornando a resposta em JSON, onde é importante que mais tarde em JS (depois de analisar JSON) eu possa fazer apenas account.role.name
.
Alterando nomes de campos em tabelas (como:id -> conta_id e:id -> role_id) seria uma solução alternativa, mas esse não é o meu caso - preciso ter uma chave primária nomeada id
para cada mesa.
[editar] Sim, então a pergunta é simples:como resolver esse problema?
Solução
Você pode usar 'select' como faria em uma consulta SQL normal:
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
Outras dicas
Complementando a resposta dada por @faia, você pode usar alias dentro de sua cláusula select, dessa forma você pode buscar apenas as chaves específicas necessárias, por exemplo.
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();