symfony - 使用 EntityType 显示选择时,无法从 Symfony 表单保存实体

标签 symfony symfony-forms

我的 symfony 项目中有两个相关实体 - 使用 Doctrine 存储。一个实体是“广告商”,它具有 ID 和名称。导致问题的另一个实体是“报告”,它有自己的 id 以及一个名为“advertiser_id”的字段。

在 Symfony 表单中添加广告商报告时,我使用 EntityType 作为advertiser_id 字段,以便可以显示选定的广告商。该部分工作得很好,但是当我尝试提交表单时,我收到错误,因为它将 Advertiser 对象而不是广告商的 id 传递到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',
    ])
;

当我提交表单时,出现以下错误: 预期参数类型为“integer”,给出“App\Entity\Advertiser”。

知道如何强制 symfony 只尝试保存所选广告商的 ID,而不是传递整个广告商吗?

UPDATE: Now that I've refactored it so that the advertiser is a related entity to report, I'm trying to figure out how to make the advertiser a hidden field and getting nowhere.

我已经尝试了前面提到的 iiirxs 与回调转换器的代码 - 将 'advertiser_id' 更改为 'advertiser' - 但我没有运气。我一直在读这样的帖子Symfony hiddenType using data_class for entity instead of transformer ,但我无法像在该示例中获取 $options['selected_course'] 那样获取“advertiser”的值。

当我尝试(出于测试目的)为广告商硬编码值 1,然后将其放在表单上时,表单会显示,但在提交时出现错误:

    $advertiser=1;

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

提交表单时出现的错误是: 预期参数类型为“App\Entity\Advertiser 或 null”,给定“string”。

我很抱歉在这件事上白费力气。这看起来应该是一件很常见/容易做的事情,但我很难找到如何使它成为一个隐藏字段。任何想法将不胜感激!

最佳答案

问题是您没有在报表实体中正确定义与广告商实体的关联。您应该定义这样的关联:

// inside Report.php class

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

而不是定义一个保存外键advertiser_id的字段。 Doctrine 足够智能,可以将advertiser 字段映射到数据库中的advertiser_id 外键,因此最好使用关联映射。您可以在 documentation 中找到更多信息.

但是,如果您出于自身原因确实必须仅使用整数来将 advertiser_id 存储为整数,则应该使用 Symfony 的数据转换器将广告商实体转换为整数,如下所示:

$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 来实现转换,但您也可以使用转换器类来执行此操作。您还可以在 data transformers documentation 中找到更多相关信息。 .

关于symfony - 使用 EntityType 显示选择时,无法从 Symfony 表单保存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54638517/

相关文章:

php - 如何在 Symfony 2.7 项目中激活 Gedmo Ip_Traceable?

Symfony2 自定义密码编码器(bcrypt)

symfony - Avalanche Imagine Bundle 如何在生产环境中运行?

symfony - 设计 Symfony2 捆绑组织的头痛

symfony - 在表单中选择选项下拉列表

php - Symfony2 : Multiple Upload File doesn't work

php - 带有 EntityType 字段的 Symfony 2.7 choice_attr

php - JSON.stringify - 如何在 Symfony2 中使用它

Symfony Form EntityType,添加自定义数据以供选择

symfony - 来自 Controller 的 CSRF token