I joust начал играть с библиотекой ORM доктрины, а Im узнал обо всех связях между таблицами.
Итак, я застрял в различиях в однонаправленном и двунаправленном отношениях.
Как я понял, однонаправленное отношение имеет первичный ключ только с одной стороны, и эта сторона владеет правой стороной? А двунаправленное отношение имеет первичный ключ в обеих таблицах, и поэтому вы можете иметь отношение с обеих сторон и устанавливать ограничения с обеих сторон.
Теперь я читаю документацию Doctrine об отношениях и там у вас есть: Unidirectional и Bidirectional.
Но они создают один и тот же SQL, и те же таблицы с теми же основными ключами и ограничениями. Поэтому я не вижу в этих двух различиях. И оба примера имеют первичный ключ с одной стороны.
Как я понял, истинное отношение двунаправленного должно иметь первичные ключи в обеих таблицах, указывающие на другую таблицу вправо? И с данным примером документации Doctrine это не так. Оба примера дают один и тот же результат и одинаковы.
Итак, что я сделал, это, скажем, у меня есть User and Card Entity и хочу, чтобы отношение было односторонним двунаправленным.
/**
* @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, я вижу одну строку, указывающую от пользователя к карте, а другую от карты к пользователю.
Итак, я понял это правильно? Неправильная документация Doctrine?: D Как отношение двунаправленного отношения OneToOne будет выглядеть в диаграмме EER?
Спасибо!