Как много людей и один человек в Symfony и Doctrine?

Я нахожу документацию очень плохой, когда речь заходит о объяснении создания отношений между сущностями. Итак, мне придется обратиться за помощью к моему коллеге 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, к чему присоединиться, это делается автоматически, если вы не настроите ее самостоятельно.