Как я могу заменить метод в переменную внутри цикла foreach? - PullRequest
0 голосов
/ 03 октября 2019

Это поля Data:

{#1292 ▼
  +"167d580ee0": 1
  +"20fc1f0271": 2
  +"585687a0fb": 3
}

my Controller:

 foreach ($fieldsData as $uuid => $fieldId) {

  $fieldsEntity = $this->getDoctrine()->getRepository($en)->findOneBy(['id' => $fieldId]);
  $name = $fieldsEntity->getName();

  $entity = new $EntityName();

  $entity->setName("test");
  $entity->setAge("test");
  $entity->setJob("test");

 }

 $this->em->persist($entity);
 $this->em->flush();

Пока это хорошо работает. Но я хочу заменить метод такой переменной:

 foreach ($fieldsData as $uuid => $fieldId) {

   $fieldsEntity = $this->getDoctrine()->getRepository($en)->findOneBy(['id' => $fieldId]);
   $name = $fieldsEntity->getName();

   $entity = new $EntityName();
   $func = 'set' . $name;
   $entity->$func("test");

 }

 $this->em->persist($entity);
 $this->em->flush();

Но сейчас я получаю сообщение об ошибке:

SQLSTATE [23000]: нарушение ограничения целостности: 1048 столбецимя не может быть нулевым

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы создаете новый $entity на каждой итерации.

Вы сказали, что при сбросе $name вы получите такой вывод:

name
age
job

Это означает, что последняя итерация приведет к этому:

foreach ($fieldsData as $uuid => $fieldId) {

   $fieldsEntity = $this->getDoctrine()->getRepository($en)->findOneBy(['id' => $fieldId]);
   $name = $fieldsEntity->getName();

   $entity = new $EntityName();
   $func = 'set' . 'job';
   $entity->$func("test");

 }

 $this->em->persist($entity); // you didn't set name in $entity, but only job.
 $this->em->flush();

Перемещение $entity = new $EntityName(); до foreach

1 голос
/ 03 октября 2019

Использовать средство доступа к свойству для этой работы:

use Symfony\Component\PropertyAccess\PropertyAccess;

$propertyAccessor = PropertyAccess::createPropertyAccessor();
$propertyAccessor->setValue($entity, $name, 'test');

Дополнительная информация: https://symfony.com/doc/current/components/property_access.html#usage

...