ArrayCollection: извлечение коллекции в форме

Я сделал веб-приложение с Symfony2, в котором у пользователя есть корреляция массива ManytoMany с сущностью Mission. Пользователь может загрузить продукт сущности $ через форму, а один из данных, передаваемых формой, – это миссия, связанная с пользователем.

Для каждого пользователя существует более одной миссии; поэтому, когда он загружает объект $ product, он также должен иметь возможность выбрать задание, которое он предпочитает.

Чтобы загрузить файл, я использую форму в контроллере следующим образом:

$form = $this->createFormBuilder($product) ->add('mission', 'entity', array('required' => true, 'multiple' => false, 'class' => 'AcmeManagementBundle:Mission', 'query_builder' => function($repository) { return $repository->createQueryBuilder('c')->orderBy('c.id', 'ASC'); },)) //... ->add('save', 'submit') ->getForm(); 

Он работает, но не очень хорошо: действительно в этом поле я могу выбрать всю сохраненную миссию, а не только те, которые связаны с пользователем.

Я попробовал затем:

  $form = $this->createFormBuilder($product) ->add('mission', 'collection', array('required' => true) ) //... ->add('save', 'submit') ->getForm(); 

Он работает, но показывает только одну миссию и не позволяет пользователю выбирать предпочтительную миссию.

Я также попробовал:

  ->add('mission', 'collection', array('required' => true) ) 

но он говорит мне:

 Neither the property "missions" nor one of the methods "getMissions()", "isMissions()", "hasMissions()", "__get()" exist and have public access in class "Acme\GroundStationBundle\Entity\Product". 

Как я должен изменить свой контроллер?

Мой продукт:

 class Product { /** * @var \Doctrine\Common\Collections\ArrayCollection * * @ORM\OneToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", mappedBy="product") */ protected $mission; //... /** * Set mission * * @param string $mission * @return Product */ public function setMission($mission) { $this->mission = $mission; return $this; } /** * Get mission * * @return string */ public function getMission() { return $this->mission; } //... 

ОБНОВИТЬ —

Я также отправлю свой продукт и объект миссии, как это было задано в комментариях

Это моя User Entity:

  abstract class User extends BaseUser { /** * @var \Doctrine\Common\Collections\ArrayCollection * * @ORM\ManyToMany(targetEntity="Acme\ManagementBundle\Entity\Mission", inversedBy="users", orphanRemoval=true) * @ORM\JoinTable(name="user_mission") */ private $missions; /** * Add missions * * @param \Acme\ManagementBundle\Entity\Mission $missions * @return User */ public function addMission(\Acme\ManagementBundle\Entity\Mission $missions) { $this->missions[] = $missions; return $this; } //... 

И моя миссия:

 <?php namespace Acme\ManagementBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; /** * @ORM\Entity */ class Mission { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") * @var integer */ protected $id; /** * @ORM\Column(type="string", length=60) * @var String */ protected $name; /** * @var \Doctrine\Common\Collections\ArrayCollection * * @ORM\ManyToOne(targetEntity="Acme\GroundStationBundle\Entity\Product", inversedBy="mission") * @ORM\JoinColumn(name="productId", referencedColumnName= "id") */ private $product; /** * @ORM\Column(type="string", length=600) * @var String */ protected $description; /** * @var \Doctrine\Common\Collections\ArrayCollection * * @ORM\ManyToMany(targetEntity="Acme\ManagementBundle\Entity\User", mappedBy="missions", cascade={"all"}, orphanRemoval=true) */ private $users; public function __construct(){ $this -> users = new ArrayCollection(); } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set name * * @param string $name * @return Mission */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set description * * @param string $description * @return Mission */ public function setDescription($description) { $this->description = $description; return $this; } /** * Get description * * @return string */ public function getDescription() { return $this->description; } /** * Add users * * @param \Acme\ManagementBundle\Entity\User $users * @return Mission */ public function addUser(\Acme\ManagementBundle\Entity\User $users) { $this->users[] = $users; return $this; } /** * Remove users * * @param \Acme\ManagementBundle\Entity\User $users */ public function removeUser(\Acme\ManagementBundle\Entity\User $users) { $this->users->removeElement($users); } /** * Get users * * @return \Doctrine\Common\Collections\Collection */ public function getUsers() { return $this->users; } public function __toString() { return $this->name; } /** * Set product * * @param \Acme\GroundStationBundle\Entity\Product $product * @return Mission */ public function setProduct(\Acme\GroundStationBundle\Entity\Product $product = null) { $this->product = $product; return $this; } /** * Get product * * @return \Acme\GroundStationBundle\Entity\Product */ public function getProduct() { return $this->product; } }