ПРИМЕЧАНИЕ. Тема длинна, но детализирована и может пригодиться, если вы используете отношения Doctrine2 и oneToOne.
Недавно я столкнулся с проблемой в Доктрине:
Я создал объекты User и UserData с однонаправленным отношением oneToOne:
User:
...
oneToOne:
userdata:
targetEntity: UserData
mappedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
inversedBy: userdata
Таким образом, UserData - это собственная сторона с столбцом user_id в ней:
user: id, ...
userdata: id, user_id, ...
Это создало проблему, когда каждый раз, когда вы извлекаете объект User (одиночный пользователь, коллекция пользователя или коллекция другого объекта с присоединенным пользователем на нем), Doctrine будет ленить загружать UserObject для каждого пользователя.
Проблема, описанная здесь:
- Как предотвратить Doctrine от ленивой загрузки одного-единственного отношения?
- http://groups.google.com/group/doctrine-user/browse_thread/thread/7e421a2b189f0ea7
- https://github.com/doctrine/doctrine2/issues/4389
Предлагаемое решение, описанное здесь:
Итак, есть три способа обойти это:
- Подождите и посмотрите, разрешено ли предлагаемое решение в Doctrine и исправлено в будущих выпусках (может и не произойти).
- Вручную оставляйте UserData пользователю в каждом запросе (по-прежнему тратить ресурсы, не нужны UserData)
- Переключите обратную сторону и сделайте Пользователем свою сторону.
Я решил пойти с №3. Итак, мои отношения в схеме теперь выглядят так:
User:
...
oneToOne:
userdata:
targetEntity: UserData
inversedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
mappedBy: userdata
Это означает, что мои таблицы теперь выглядят следующим образом:
user: id, userdata_id, ...
userdata: id, ...
Я решил, что вместо того, чтобы иметь Userdata.id автоинкремент, я буду устанавливать его вручную и сопоставлять его с user.id. Это означает, что UserData.id всегда будет соответствовать user.id.
Вопрос Можно ли использовать user.id(основной автоинкрементный ключ) как joinColum вместо userdata_id, так как они всегда будут иметь одинаковое значение? Понимаете ли вы какие-либо потенциальные проблемы с этим способом выполнения вещей?
Любые другие советы или мнения по этому вопросу очень приветствуются и оцениваются.