Я сделал веб-приложение с 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; } }