Symfony4 — Как обновить учение ArrayCollection?

У меня есть член моей сущности массив 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();
}
}

Есть идеи ?

0

Решение

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

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

0

Другие решения

Проблема в этой части: $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

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

  1. В Doctrine вам никогда не придется работать с идентификаторами. Используйте сущность
    объекты! Вам нужно только найтиById, если вы получаете ID из параметра запроса, например.
  2. Вам следует пересмотреть наименование ваших переменных, чтобы было ясно, является ли это коллекцией ($ availableabilities) или одной ($ Availability).
  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

У меня есть член моей сущности массив 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();
}
}

Есть идеи ?

0

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

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

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

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

active «data-shortcut =» A

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

  1. В Doctrine вам никогда не придется работать с идентификаторами. Используйте сущность
    объекты! Вам нужно только найтиById, если вы получаете ID из параметра запроса, например.
  2. Вам следует пересмотреть наименование ваших переменных, чтобы было ясно, является ли это коллекцией ($ availableabilities) или одной ($ Availability).
  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();
самый старый «data-shortcut =» O
голосует «data-shortcut =» V
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector