Двунаправленные и однонаправленные отношения
Двунаправленные и однонаправленные ссылки о ссылках в ваших объектах PHP.
Как вы можете видеть здесь , схемы базы данных для однонаправленных и двунаправленных ссылок фактически одинаковы.Разница в следующем:
- Однонаправленный: объекты класса A относятся к объектам класса B, но не наоборот.
- Двунаправленный: объекты класса A относятся к объектам класса B иобъекты класса B ссылаются на объекты класса A
Обратная и владеющая стороны
Концепция владения и обратной стороны заключается в сохранении изменений вашей объектной модели в базе данных. Здесь - подробное объяснение.
Короче говоря, Doctrine 2 не отслеживает изменения в объектной модели.Допустим, у вас есть два класи: Parent
и Child
.Класс Parent
имеет коллекцию children
.Класс «Ребенок» имеет ссылку parent
.Следующий код сделает вашу модель данных несовместимой:
$parent = new Parent();
$child = new Child();
$parent->children->add($child);
Плохо иметь открытые свойства в классах сущностей, и это крайне нежелательно, но по причинам демонстрации это нормально.Итак, следующий код добавляет $child
к $parent
, но не устанавливает $child->parent
.Модель предметной области становится непоследовательной (и поэтому руководство Doctrine рекомендует инкапсулировать логику ассоциации в модели сущностей ), но все еще возможно сохранить эти объекты в БД.
Вот где концепция владения иобратные стороны становятся важными.Доктрина сохранит отношения сущностей в соответствии с состоянием владеющей стороны .Таким образом, в нашем примере отношение $parent
=> $child
будет:
- Сохранено, если сторона-владелец
Parent
class - Игнорируется, если сторона-владелец
Child
класс
Обратите внимание, что сторона-владелец помечена аннотацией отношения inversedBy .
Существует рекомендация при выборе владельца иобратные стороны.