Поддержание множества ссылок с формой

#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. Это означает, что у вас другая проблема, поскольку связь установлена правильно.