Laravel красноречивый – предотвращение переопределения значений при объединении таблиц

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Итак, у меня есть следующие две модели: 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();

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

Другие советы

Дополняя ответ, данный @бук, вы можете использовать псевдоним внутри предложения выбора, таким образом вы сможете получить только те ключи, которые вам нужны, например.

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top