Доктрина - Onetoone однонаправленный против OneToOne двунаправленный

Я начал играть с библиотекой Doctrine ORM, и я узнал обо всех ассоциациях между таблицами.

таким образом, я застрял с различиями в однонаправленном и Двунаправленном отношении.

Как я понимаю, однонаправленное отношение имеет первичный ключ только с одной стороны, и эта сторона владеет стороной справа? И двунаправленное отношение имеет первичный ключ в обеих таблицах, и поэтому вы можете иметь отношение с обеих сторон и устанавливать ограничения на обоих стороны.

теперь, я читаю через доктрину документацию об отношениях, и там у вас есть: однонаправленный и двунаправленный ассоциации.

но они производят тот же SQL и те же таблицы с тем же первичным ключом-s и ограничениями. Так что я не вижу никакой разницы между этими двумя. И оба примера имеют первичный ключ с одной стороны.

Как я понимаю, истинное двунаправленное отношение должно иметь первичные ключи в обеих таблицах указывая на другой стол справа? И с приведенным примером по документации доктрины это не так. Оба примера дают один и тот же результат и одинаковы.

Итак, что я сделал, это, скажем, у меня есть сущность User и Card и хочу, чтобы отношение было однонаправленным.

    /**
 * @Entity
 * @Table(name="users")
 */

class User
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="Card", mappedBy="User")
     * @JoinColumn(name="card_id", referencedColumnName="id")
     */
    protected $card;

    /**
     * @Column(name="user_name", type="string")
     */
    protected $userName;

    /**
     * @Column(name="user_pass", type="string")
     */
    protected $userPass;
}

    /**
 * @Entity
 * @Table(name="cards")
 */

class Card
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="User", inversedBy="Card")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /**
     * @Column(name="post_title", type="string")
     */
    protected $cardType;
}

разница здесь в том, что я написал @JoinColumn в обоих объектах / сущностях. А в учении пример только один. Теперь я бы получил то, что я считаю двунаправленным отношением. Если я посмотрю на EER диаграмма, я вижу одну линию, указывающую от пользователя к карте, а другую от карты к пользователю.

Так в основном я правильно понял? Это учение документации неправильно? :Д Как бы двунаправленное отношение OneToOne выглядело на диаграмме EER?

спасибо!

2 ответов


единственное различие заключается в интерфейсе класса PHP, т. е. в наличии или отсутствии свойства, которое указывает на владельца (например,$customer свойство в упомянутом примере доктрины). Другими словами, доктрина просто должна знать, должна ли она заботиться об одном свойстве ($shipping) или два свойства ($cart и $customer). Другой разницы нет. Таким образом код SQL является тем же (потому что один внешний ключ достаточно для представления любого отношения 1:N) и не было бы никакой разницы в диаграмме EER (потому что в EER вы обычно не решаете такие детали реализации, связанные с PHP).


однонаправленный и двунаправленный не имеют ничего общего с фоновым алгоритмом создания этих соединений в слое базы данных.

все они говорят о том, как можно использовать соединения. В однонаправленную связь вы можете получить доступ к цели только с одного сайта. Двунаправленное отношение позволяет вызывать соединение с двух (обеих) сторон.

Так в юнидир. выпуск. model_a может попасть в model_b, но model_b не может попасть в model_a (без дополнительная работа.) Если вы сейчас используете бидир. рел обе модели могут получить доступ друг к другу без проблем

в терминах доктрины однонаправленное отношение определяет $modelA->getModelB() метод, но не $modelB->getModelA() метод, тогда как двунаправленная связь определяет оба метода (или аксессоры, как бы вы их ни называли)

на диаграмме uml это будет выглядеть так:

unidirectional
modelA --X------> modelB

bidirectional
modelA <--------> modelB