Доктрина - 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