#php #mysql #symfony #orm #doctrine
#php #mysql #symfony #orm #доктрина
Вопрос:
у меня есть однозначное отношение между моей сущностью User и UserMeta
я хотел бы иметь доступ к UserMeta в User, но установить внешний ключ в таблице UserMeta в моей базе данных mysql:
class User implements UserInterface{
/**
* @ORMColumn(type="integer", unique=true)
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMOneToOne(targetEntity="FooBarEntityUserMeta", cascade={"persist"}, inversedBy="id_user")
* @ORMJoinColumn(nullable=true)
* @ORMColumn(name="id_pro")
*/
private $proData;
}
class UserMeta{
/**
* @ORMColumn(type="integer", unique=true)
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMOneToOne(targetEntity="FooBarEntityUser", mappedBy="id_pro")
* @ORMJoinColumn(nullable=true)
* @ORMColumn(name="id_user")
*/
private $user;
}
В любом случае, чтобы сделать это с doctrine? Я думаю, что я неправильно понял отображенные и инвертированные свойства.
Комментарии:
1. Привет @MarcD, несколько месяцев назад я написал пост о взаимно однозначном сопоставлении. В нем также рассказывается об атрибуте inversed by. Если вам интересно, вот ссылка. anjanasilva.com/blog /…
2. Я просмотрел ваш tuto, но у вас все еще есть program_details_id в вашей таблице program, нет?
3. product_details_id — это имя столбца текущей таблицы (product), на которое вы ссылались на первичный ключ целевой таблицы (product_details). Или, в лучшем случае, вы можете сопоставить первичный ключ текущей таблицы с первичным ключом целевых таблиц.
4. Значит, у меня не может быть ProductDetails (на php) в моем объекте product без наличия внешнего ключа в таблице product? Я просто хочу иметь идентификатор программы в таблице program_details, но меня не волнует двунаправленное отношение.
5. Если вы упомянули mappedBy или inversedBy, он ожидает, что отображенный бит или инвертированный бит от целевого объекта. Предположим, вы ссылаетесь из таблицы A в таблицу B. Для формирования базовой взаимосвязи вы упоминаете OneToOne / OneToMany / etc в сущности A. Но если вы упоминаете inversedBy или mappedBy в сущности A, вам необходимо иметь соответствующий атрибут mappedBy (если он инвертирован) или inversedBy (если он сопоставлен) в сущности B. Надеюсь, вы уловили суть. Приветствия!
Ответ №1:
У вас неправильная конфигурация отображения.
В вашем пользовательском классе он должен читать:
/**
* @ORMOneToOne(targetEntity="FooBarEntityUserMeta", cascade={"persist"}, inversedBy="user")
* @ORMJoinColumn(nullable=true)
*/
private $proData;
и в вашем классе UserMeta он должен гласить:
/**
* @ORMOneToOne(targetEntity="FooBarEntityUser", mappedBy="proData")
* @ORMJoinColumn(nullable=true)
*/
private $user;
Вам также не нужна директива @ORM Column, поскольку Doctrine2 автоматически сделает это за вас.