Есть ли у таблицы sfGuardUser первичный ключ?

#symfony1 #doctrine

#symfony1 #доктрина

Вопрос:

Я новичок в Symfony и Doctrine и пишу веб-приложение. Я добавил sfDoctrineGuardPlugin в свой проект. Когда я открываю файл schema.yml для плагина, я вижу это:

 sfGuardUser:
actAs: [Timestampable]
columns:
  first_name: string(255)
  last_name: string(255)
  email_address:
    type: string(255)
    notnull: true
    unique: true
  username:
    type: string(128)
    notnull: true
    unique: true
  algorithm:
    type: string(128)
    default: sha1
    notnull: true
  salt: string(128)
  password: string(128)
  is_guest:
    type: boolean
    default: 0
  is_active:
    type: boolean
    default: 1
  is_super_admin:
    type: boolean
    default: false
  last_login:
    type: timestamp
indexes:
  is_active_idx:
    fields: [is_active]
relations:
  Groups:
    class: sfGuardGroup
    local: user_id
    foreign: group_id
    refClass: sfGuardUserGroup
    foreignAlias: Users
  Permissions:
    class: sfGuardPermission
    local: user_id
    foreign: permission_id
    refClass: sfGuardUserPermission
    foreignAlias: Users
  

Генерирует ли эта схема таблицу с первичным ключом (и если да, то как мне получить к ней доступ)? Я посмотрел онлайн, и на большинстве страниц, которые охватывают схему для sfGuardUser, отображается столбец id, который является первичным ключом. Чего я не понимаю? Спасибо.

Ответ №1:

Да, это id , доступ к которому осуществляется как sfGuardUser u —> u.id , как в…

 $user = Doctrine::getTable('sfGuardUser')->findOneById(55);
  

или…

 $q = Doctrine_Query::create()
  ->select('u.*')
  ->from('sfGuardUser u')
  ->where('u.id = ?', 55);
$q->execute();
  

Я думаю, где-то в документации Doctrine говорится, что Doctrine автоматически генерирует первичный ключ «id», если он не объявлен в файле YAML. Раньше это было объявлено явно в схеме sfGuardPlugin, но начиная с Symfony 1.4.8 (я думаю), это просто не написано.

Следует обратить внимание на то, что в другом месте вашей схемы вам нужно убедиться, что вы объявляете тот же числовой тип для другого конца отношения внешнего ключа, иначе это выдаст ошибку. Я думаю, это как раз type: integer то, что вам нужно.

Комментарии:

1. Спасибо за ответ. Рекомендуется ли явно определять столбец id в схеме для sfGuardUser? И если да, то как бы вы порекомендовали его определить?

2. @The Travelling Coder: Лично мне нравится определять все столбцы в схеме, поскольку я нахожу это более понятным, и мне не нравится, когда Doctrine делает что-то за меня за кулисами. Однако, в частности, для sfGuardUser я, вероятно, не стал бы его трогать, поскольку обновления самого плагина могут перезаписать схему — как это произошло с этим относительно недавним выпуском.

3. Хотя мне пока нравятся Symfony и Doctrine, я нахожу, что automagic-это помеха, когда дело доходит до изучения нового фреймворка. Не могли бы вы, пожалуйста, прояснить одну последнюю деталь: поскольку вы рекомендуете оставить схему sfGuardUser нетронутой, тогда мне нужно было бы создать модель профиля и связать ее с sfGuardUser, если бы я хотел сохранить больше пользовательских данных, правильно? Пример: http://symfony.com/blog/call-the-expert-customizing-sfdoctrineguardplugin

4. @The Travelling Coder: Да, точно, таблица профилей с отношением «один к одному» к sfGuardUser, что означает, что sfGuardUser действительно в основном используется только для аутентификации.

Ответ №2:

Если первичный ключ не указан, doctrine создаст поле идентификатора с типом bigint и с первичным ключом.