Laravel красноречивый – предотвращение переопределения значений при объединении таблиц
Вопрос
Итак, у меня есть следующие две модели: Account
и Role
class Account extends Eloquent
{
protected $table = 'account';
/* [...] */
public function group() {
return $this->belongsTo('Group');
}
}
и
class Role extends Eloquent {
protected $table = 'role';
public function accounts() {
return $this->hasMany('Account');
}
}
и таблицы базы данных: account
и role
account
-------
id
name
role_id (nullable)
role
----
id
name
А теперь дело в следующем:
мне нужно заказать accounts
к role.name
столбец.Но после соединения (или левого соединения) значения переопределяются значениями из второй таблицы.Вот код:
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
После этого значения для id
и name
неверны в красноречивых сборниках.
Кроме того, мне нужно, чтобы возврат был красноречивыми моделями типов, поскольку я возвращаю ответ в JSON, где важно, чтобы позже в JS (после анализа JSON) я мог просто сделать account.role.name
.
Изменение названий полей в таблицах (например:id -> account_id и:id -> role_id) было бы обходным решением, но это не мой случай — нужно иметь первичный ключ с именем id
за каждый стол.
Редактировать] Да, так что вопрос просто:как решить эту проблему?
Решение
Вы можете использовать «select», как в обычном SQL-запросе:
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
Другие советы
Дополняя ответ, данный @бук, вы можете использовать псевдоним внутри предложения выбора, таким образом вы сможете получить только те ключи, которые вам нужны, например.
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();