Пользовательские столбцы в представлении списка в генераторе администратора Symfony

tl;dr: Мне нужно отобразить данные из двух разных таблиц в представлении списка генератора администратора Symfony (желательно с помощью оператора JOIN)

Я использую sfDoctrineGuardPlugin для управления пользователями моего приложения. У каждого пользователя также есть свой профиль, который он может заполнить. Схема (schema.yml) для таблицы профиля выглядит следующим образом:

sfGuardUserProfile:
  connection: doctrine
  tableName: sf_guard_user_profile
  columns:
    sf_guard_user_id: integer(8)
    client_id: string(128)
  relations:
    sfGuardUser:
      local: sf_guard_user_id
      foreign: id
      foreignType: one
      onDelete: CASCADE

Прямо сейчас таблица является client_id и внешним ключом к столбцу id в таблице sfGuardUser. (Да, я знаю, что мне нужен столбец id только для доступа к БД, и позже будет добавлено больше)

Я создал администратора для своей таблицы профилей, используя генератор администратора Symfony. Я бы хотел, чтобы мой список в админке выглядел так (generator.yml):

config:
  ...
  list:
    title:   Clients
    display: [client_id, sf_guard_user_id, username]
    table_method: retrieveProfileList

Однако мой столбец имени пользователя не работает, и я получаю Doctrine_Record_UnkownPropertyException из:

Unknown record property / related component "username" on "sfGuardUserProfile"

Я надеялся, что пользовательский метод table_method для заполнения данных для представления списка поможет мне, но мой табличный метод (в lib/model/sfGuardUserProfileTable.class.php), похоже, не помогает. Я следовал примеру из книги по Symfony, и это это метод:

public static function retrieveProfileList(Doctrine_Query $q)
{
  $rootAlias = $q->getRootAlias();

  $q->leftJoin($rootAlias . '.sfGuardUser id');

  return $q;
}

Любые идеи о том, как сделать так, чтобы генератор администратора Symfony отображал представление списка на основе соединения? Или, как вариант, как вытащить из отдельной модели?


person CamelBlues    schedule 27.07.2011    source источник


Ответы (1)


Я сам ответил на свой вопрос!

Я изменил метод соединения в своем классе sfGuardUserProfileTable на что-то более понятное (спасибо эта полезная ссылка):

public static function retrieveProfileList(Doctrine_Query $q)
{
  return $q->select('r.*, u.username')
          ->leftJoin('r.sfGuardUser u');
}

И добавил метод getUsername в мой класс модели sfGuardUserProfile

  public function getUsername()
  {
      return $this->sfGuardUser->username;
  }

Спасибо за то, что был моей резиновой уткой, ТАК!

person CamelBlues    schedule 27.07.2011