Symfony4 - Как обновить учение ArrayCollection? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть член моей сущности - arrayCollection.Когда классический конструктор форм работает нормально, я могу выбрать несколько элементов и сохранить их.Но когда я пытаюсь обновить объект в контроллере, я получаю ошибку: «Вызов функции-члена setFaavailability () on array».

Резюме моей сущности:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\FaAvailability", 
   inversedBy="faavailability")
 * @ORM\JoinColumn(nullable=true)
 * @ORM\Column(type="array")
 */
 public $faavailability;

 /**
 * @return mixed
 */
public function getFaavailability()
{
    return $this->faavailability;
}

/**
 * @param mixed $faavailability
 */
public function setFaavailability($faavailability)
{
    $this->faavailability = $faavailability;
}

В моем контроллере:

 $varFaavailability = $animal->faperson->getFaavailability();
 foreach($varFaavailability as $availability){
         if($availability->getName() == $animal->typepet->getName()){
           $varFaavailability->removeElement($availability);
           $faPerson = $em->getRepository(FaPerson::class) >findById($animal->faperson->getId());
           $faPerson->setFaavailability($varFaavailability);
           $em->persist($faPerson);
           $em->flush();
         }
}

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Проблема в этой части: $faPerson = $em->getRepository(FaPerson::class)->findById($animal->faperson->getId());

Методы findBy* попытаются найти несколько сущностей и вернуть их в Collection.Если вы ищете одного человека, вы можете использовать findOneById вместо этого.Или (при условии, что id настроен как идентификатор в Doctrine), вы даже можете использовать метод find: $faPerson = $em->getRepository(FaPerson::class)->find($animal->faperson->getId());

0 голосов
/ 28 декабря 2018

некоторые общие комментарии:

  1. В Doctrine вам никогда не придется работать с идентификаторами.Используйте объекты сущности!Вам нужно только найти findById, если вы получаете идентификатор из параметра запроса, например.
  2. Вам следует пересмотреть именование ваших переменных, чтобы было ясно, является ли это коллекцией ($ availableabilities) или одной ($доступность).
  3. Всегда используйте методы getter / setter вместо полей (typepet vs getTypepet ()).
  4. В конце вызывайте flush () для обновления всех сущностей в одной транзакции.

Я переименовал переменные ниже, как я их понял.Однако я до сих пор не уверен, что возвращает $ animal-> faperson-> getFaavailabilities (), так как в начале вы хотите перебрать результаты, а затем установить их в один с помощью setFaavailability ()?

 //Should be a Doctrine ArrayCollection
 $varFaavailabilities = $animal->faperson->getFaavailabilities();

 foreach($varFaavailability as $availability){
         if($availability->getName() == $animal->getTypepet()->getName()) {

           //Why do you want to remove an element from the current loop?
           $varFaavailability->removeElement($availability);

           //No need to use Id
           $faPerson = $animal->getFaperson();

           //A single one?
           $faPerson->setFaavailability($availability);

           //More than one? addFaavailability should exist.
           $faPerson->addFaavailability($availability);

           $em->persist($faPerson);

         }
}
$em->flush();
0 голосов
/ 28 декабря 2018

Если я хорошо помню, когда вы устанавливаете поле как ArrayCollection, это означает, что у вас есть отношение oneToMany между двумя объектами.Из вашего кода я могу сказать, что вы пытаетесь сохранить данные в неправильном объекте.Обычно вы добавляете owning_entity_id ( 1 -to-N) в каждый элемент (от 1 до N ) и сохраняете его.В своем коде вы пытаетесь установить все ссылки одновременно, чего никогда не произойдет.Удалите setFaavailability () или переопределите отношения сущностей.

Никогда не пытайтесь массово добавлять отношения внешнего ключа в одну super duper функцию установки.Прокрутите все элементы и установите ссылку на «родительскую» сущность.

...