Laravel eloquente: prevenire i valori preliminari quando si uniscono le tabelle
Domanda
OK, quindi ho seguito due modelli: 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 tabelle del database: account
e role
account
-------
id
name
role_id (nullable)
role
----
id
name
.
e ora la cosa è:
Ho bisogno di ordinare accounts
tramite colonna role.name
. Ma dopo il join (o i valori di sinistra) sono sovrascriviti da quelli dalla seconda tabella. Ecco alcuni codici:
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
.
Dopo che i valori per id
e name
non sono corretti nelle raccolte eloquenti.
Inoltre, ho bisogno del ritorno per essere modelli di tipo eloquente mentre torno indietro alla risposta in JSON, dove è importante che successivamente in JS (dopo analizzare JSON) posso fare solo account.role.name
.
Modifica dei nomi dei campi nelle tabelle (come: ID -> ACCOUNT_ID, e: ID -> Role_ID) sarebbe una soluzione alternativa, ma non è il mio caso - è necessario avere la chiave primaria denominata id
per ogni tabella.
[modifica] Sì, quindi la domanda è semplicemente: come risolvere quel problema?
Soluzione
È possibile utilizzare 'Seleziona' come se desideri in una normale query SQL:
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
.
Altri suggerimenti
Complemendo la risposta fornita da @Beech , è possibile utilizzare l'alias all'interno della clausola di selezione, in questo modo è possibile recuperare solo i tasti specifici di cui hai bisogno E.G.
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();
.