При использовании EntityType для отображения выбора не удается сохранить сущность из формы Symfony - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два связанных объекта в моем проекте Symfony, которые хранятся с использованием Doctrine.Один объект - это «Рекламодатель», у которого есть идентификатор и имя.Другая сущность, которая является причиной проблемы, предназначена для «Отчета», который имеет собственный идентификатор вместе с полем «advertiser_id».

При добавлении отчета для рекламодателя в форме SymfonyЯ использую EntityType для поля advertiser_id, чтобы я мог отображать выборку рекламодателей.Эта часть работает отлично, но когда я пытаюсь отправить форму, я получаю сообщение об ошибке, потому что она передает объект Advertiser вместо идентификатора рекламодателя в поле advertiser_id.

Вот что у меня есть в моей форместроитель:

$builder
    ->add('advertiser_id', EntityType::class, [
        'class'        => Advertiser::class,
        'query_builder' => $this->advertiserRepository->findAllNotDeletedUnpaginated(),
        'choice_label' => 'name',

    ])
    ->add('submit', SubmitType::class, [
        'label' => 'Submit',
    ])
;

Когда я отправляю форму, я получаю эту ошибку: указан ожидаемый аргумент типа "целое число", "App \ Entity \ Advertiser".

Любое представление о том, как яможет заставить Symfony только пытаться сохранить идентификатор рекламодателя, который был выбран, а не пропустить весь рекламодатель?

ОБНОВЛЕНИЕ: Теперь, когда я реорганизовал его, чтобы рекламодатель былсвязанный объект для отчета, я пытаюсь выяснить, как сделать рекламодателя скрытым полем и получить его никуда.

Я пробовал код, упомянутый ранее iiirxs, с помощью преобразователя обратного вызова.- изменив рекламодатель на рекламодатель, но мне не повезло.Я читал сообщения вроде этого Symfony hiddenType, используя data_class для объекта вместо преобразователя , но у меня возникают проблемы с получением значения для рекламодателя так, как они получают параметры $ [[selected_course]] вэтот пример.

Когда я пытаюсь (для целей тестирования) жестко кодировать значение 1 для рекламодателя, а затем помещать его в форму, форма показывает, но при отправке я получаю сообщение об ошибке:

    $advertiser=1;

    $builder
        ->add('advertiser', HiddenType::class,['data' => $advertiser, 'data_class' => null])

Ошибка при отправке формы: ожидаемый аргумент типа "App \ Entity \ Advertiser or null", задана строка "*. 1025 *

Извините за избиение мертвой лошадиэтот.Кажется, что это должно быть настолько распространено / легко, но мне трудно найти способ сделать это скрытым полем.Любые идеи будут с благодарностью!

1 Ответ

0 голосов
/ 12 февраля 2019

Проблема в том, что вы неправильно определили связь с сущностью рекламодателя в своей сущности отчета.Вы должны были определить ассоциацию следующим образом:

// inside Report.php class

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Advertiser")
 */
private $advertiser;

вместо определения поля, содержащего внешний ключ advertiser_id.Doctrine достаточно умен, чтобы сопоставить поле рекламодателя с внешним ключом advertiser_id в вашей базе данных, поэтому было бы лучше использовать сопоставление ассоциации.Вы можете найти больше в документации .

Однако, если вам действительно нужно использовать только целое число для хранения advertiser_id в качестве целого числа по вашим собственным причинам, вы должны использовать данные Symfony.Transformer для преобразования сущности рекламодателя в целое число, подобное этому:

$advertiserRepository = $this->advertiserRepository;
$builder->get('advertiser_id')
        ->addModelTransformer(new CallbackTransformer(
            function ($advertiserAsInteger) use ($advertiserRepository) {
                // transform the integer to an entity object
                return $advertiserRepository->find($advertiserAsInteger);
            },
            function ($advertiserAsEntity) {
                // transform the entity back to an integer
                return $advertiserAsEntity->getId();
            }
        ))
    ;

В моем коде выше я использовал CallbackTransformer для реализации преобразования, но вы также можете использовать класс преобразователя для этого.Вы также можете найти больше об этом в документации преобразователей данных .

...