#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 и с первичным ключом.