Я нахожу документацию очень плохой, когда речь заходит о объяснении создания отношений между сущностями. Итак, мне придется обратиться за помощью к моему коллеге StackExchangers. Итак, я пытаюсь построить следующие случаи:
Дело 1
User
принадлежит к одной или нескольким Group
, и у Group
может быть много Permission
. User
также может иметь Permission
.
Случай 2
Ticket
имеет Category
, несколько Tag
и несколько Comment
.
Заранее спасибо!
Конечно. Первое, что нужно понять, это то, что для этого нет «одного способа». Доктрина дает большую гибкость в отношении того, как вы определяете взаимосвязь – даже если несколько определений производят то же самое DDL (и это важно понять), некоторые из вариантов отображения влияют только на объектную сторону ORM, а не на модель -боковая сторона)
Вот пример ваших пользователей / групп / разрешений, которые на самом деле являются ассоциациями «многие-ко-многим» (я исключил все необязательные, но требуемые коды, например, определение столбцов PK)
<?php namespace Your\Bundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity */ class User { /** * Many-To-Many, Unidirectional * * @var ArrayCollection $groups * * @ORM\ManyToMany(targetEntity="Group") * @ORM\JoinTable(name="user_has_group", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} * ) */ protected $groups; /** * Many-To-Many, Unidirectional * * @var ArrayCollection $permissions * * @ORM\ManyToMany(targetEntity="Permission") * @ORM\JoinTable(name="user_has_permission", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} * ) */ protected $permissions; public function __construct() { $this->groups = new ArrayCollection(); $this->permissions = new ArrayCollection(); } } /** * @ORM\Entity */ class Group { /** * Many-To-Many, Unidirectional * * @var ArrayCollection $permissions * * @ORM\ManyToMany(targetEntity="Permission") * @ORM\JoinTable(name="group_has_permission", * joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} * ) */ protected $permissions; public function __construct() { $this->permissions = new ArrayCollection(); } } /** * @ORM\Entity */ class Permission {}
Если у вас есть вопросы о том, что происходит здесь, дайте мне знать.
Теперь, к вашему второму примеру
<?php namespace Your\Bundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity */ class Ticket { /** * Many-To-One, Unidirectional * * @var Category * * @ORM\ManyToOne(targetEntity="Category") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") */ protected $category; /** * Many-To-Many, Unidirectional * * @var ArrayCollection $permissions * * @ORM\ManyToMany(targetEntity="Tag") * @ORM\JoinTable(name="tickt_has_tag", * joinColumns={@ORM\JoinColumn(name="ticket_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} * ) */ protected $tags; /** * One-To-Many, Bidirectional * * @var ArrayCollection $comments * * @ORM\OneToMany(targetEntity="Comment", mappedBy="ticket") */ protected $comments; public function __construct() { $this->tags = new ArrayCollection(); $this->comments = new ArrayCollection(); } } /** * @ORM\Entity */ class Comment { /** * Many-To-One, Bidirectional * * @var Ticket $ticket * * @ORM\ManyToOne(targetEntity="Ticket") * @ORM\JoinColumn(name="ticket_id", referencedColumnName="id") */ protected $ticket=null; } /** * @ORM\Entity */ class Tag {} /** * @ORM\Entity */ class Category {}
Как и прежде, дайте мне знать, если вы хотите, чтобы все это объяснялось.
PS Ничего из этого не было действительно проверено, я просто немного ударил его в своей среде IDE очень быстро. Там может быть опечатка или две;)
Попробуй это:
Class User { /** * @ORM\OneToMany(targetEntity="path\to\group", mappedBy="user", cascade={"persist", "remove"}) */ private $group;
У вас будет одно отношение между User
и Group
. targetEntity
– это путь к Entity, с которым вы хотите иметь отношение, mappedBy
– это переменная из Group
Entity. cascade
средства User
может добавить в Group
и удалить из Group
Группа классов {
/** * @ORM\ManyToOne(targetEntity="path\to\user, inversedBy="group") * @ORM\JoinColumn(name="user_id", referencedColumnName="id") */ private $user;
Это резервная сторона отношений. targetEntity
должен иметь путь к родительскому объекту, который является User
в этом случае. inversedBy
– переменная из User
Entity. JoinColumn
просто сообщает Doctrine, к чему присоединиться, это делается автоматически, если вы не настроите ее самостоятельно.