#symfony #doctrine-orm
#symfony #doctrine-orm
Вопрос:
Представьте эти 2 объекта
Intervention
- items # OneToMany (no cascade)
addItem()
removeItem()
Item
- intervention # ManyToOne
Когда я выполняю Intervention
я хочу выбрать Items
соответствующую.
Я использую Intervention
форму, в которой я могу прикреплять / отсоединять элементы
->add('items', EntityIdType::class, array(
'class' => Item::class,
'multiple' => true,
))
Когда форма отправлена, я вижу, что Doctrine вызывает мои Intervention
‘s addItem()
, removeItem()
Но когда я очищаю все ранее подключенные элементы (таким образом, отправляя null
как items
), Doctrine сообщает мне:
Ни свойство «items», ни один из методов «addItem()» / «removeItem()», «setItems()», «items()», «__set()» или «__call()» не существуют и не имеют общедоступного доступа в классе «AppBundle Entity Intervention».
Первый вопрос: почему Doctrine не находит мои средства доступа, когда я отправляю null
список элементов?
Ответ №1:
Мой обходной путь на данный момент заключается в реализации setItems()
добавления / удаления:
/**
* Set items
*
* @param $items
*
* @return Intervention
*/
public function setItems($items)
{
foreach ($this->items as $item) {
$this->removeItem($item);
}
if ($items) {
foreach ($items as $item) {
$this->addItem($item);
}
}
return $this;
}
Ответ №2:
Я думаю, вам нужно использовать ArrayCollection
на другой стороне ManyToOne
отношений. Ваш AppBundleEntityItem
класс сущностей должен иметь:
use AppBundleEntityIntervention;
//...
/**
* @ORMManyToOne(targetEntity="AppBundleEntityIntervention", inverseBy="items")
*/
private $intervention;
/**
* @param Intervention $intervention
*/
public function setIntervention(Intervention $intervention){
$this->intervention = $intervention;
}
/**
* @return Intervention
*/
public function getIntervention(){
return $this->intervention;
}
Затем в AppBundleEntityIntervention
классе сущностей:
use DoctrineCommonCollectionsArrayCollection;
//...
/**
* @ORMOneToMany(targetEntity="AppBundleEntityItem", mappedBy="intervention")
*/
private $items;
public function __construct(){
$this->items = new ArrayCollection();
}
public function getItems(){
return $this->items;
}
public function setItems($items){
$this->items = $items;
}
Комментарии:
1. Это то, что я делал в начале, но
Item
средства доступа не запускаются, поэтому они никогда не связаны с вмешательством.2. Это означает, что у вас другая проблема, поскольку связь установлена правильно.