Ох, ну и накуролесили вы тут. Как оно вощбще работает?))
Если делать вашим методом, то сущность Test должна выглядеть примерно так:
/**
* Test
* @ORM\Table(name="test")
* @ORM\Entity
*/
class Test {
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Acme\AppBundle\Entity\Breakagedemand", mappedBy="test", cascade={"persist"})
*/
private $collection;
public function __construct()
{
$this->collection = new ArrayCollection();
}
...
public function addCollection( Breakagedemand $breakagedemand )
{
// Устанавливаем для каждого добавляемого в коллекцию элемента тест, к которому он относится
$breakagedemand->setTest($this);
// И только после этого добавляем его в коллекцию
$this->collection[] = $breakagedemand;
return $this;
}
...
}
А сущность Breakagedemand так:
/**
* Breakagedemand
* @ORM\Table(name="breakagedemand")
* @ORM\Entity
*/
class Breakagedemand {
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
// cascade={"persist"} тут не нужен, с этой стороны мы не будем редактировать сущность Breakage
// Название сущности выбрано неверное, так как тут не будет никакого ID, а будет экземпляр сущности Breakage
/**
* @var integer
* @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Breakage", inversedBy="breakagedemands")
* @ORM\JoinColumn(name="posbreakage_id", referencedColumnName="id")
*/
private $posbreakage;
// cascade={"persist"} тут не нужен, с этой стороны вы тест добавлять никогда не будете
// referencedColumnName="id" должен быть ID - так как мы связываем после по ИД с таблицей тестов
/**
* @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Test", inversedBy="collection")
* @ORM\JoinColumn(name="test_id", referencedColumnName="id")
*/
private $test;
// $this->test не является коллекцией, не надо объявлять new ArrayCollection() в конструкторе
public function __construct()
{
}
// соответственно метод должен быть не addTest а setTest
public function setTest(Test $test = null)
{
$this->test = $test;
return $this;
}
public function getTest()
{
return $this->test;
}
public function setPosbreakage(Breakage $posbreakage )
{
$this->posbreakage = $posbreakage;
return $this;
}
/**
* Get posbreakage
* @return integer
*/
public function getPosbreakage()
{
return $this->posbreakage;
}
}
В комментах я написал где вы накосячили.
На сколько я понял вашу задачу, у вас есть заранее составленный список возможных поломок. И к тесту надо просто прикрепить некоторые из них. В этом случае вам лучше совсем убрать сущность Breakagedemand и просто сделать связь многие ко многим Test и Breakage(это если в сущности Breakagedemand не хранятся дополнительные данные и если одна поломка не должна добавляться несколько раз):
/**
* Test
* @ORM\Table(name="test")
* @ORM\Entity
*/
class Test {
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* Список номеров, в котором должно выйти объявление
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Breakage")
* @ORM\JoinTable(name="test2breakage",
* joinColumns={
* @ORM\JoinColumn(name="test_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="breakage_id", referencedColumnName="id")
* }
* )
*/
private $breakages;
public function __construct()
{
$this->breakages = new ArrayCollection();
}
public function addBreakage(Breakage $breakage)
{
$this->breakages[] = $breakage;
return $this;
}
/**
* Remove nomer
*
* @param Breakage $breakage
*/
public function removeBreakage(Breakage $breakage)
{
$this->breakages->removeElement($breakage);
}
/**
* Get nomer
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBreakages()
{
return $this->breakages;
}
}
/**
* @ORM\Entity
*
**/
class Breakage
{
// ...
}
И форма для работы с такой сущностью будет в 100 раз проще:
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
$builder->add('breakages', 'entity', array(
'class' => 'NameSpace\MyBundle\Entity\Breakage',
'property' => 'name',
'multiple' => true
));
}
Неймспейсы я брал на обум, если что поправите.