Доктрина обратного внешнего ключа

#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 автоматически сделает это за вас.