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

2024-02-18

我的 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,而不是传递整个广告商,有什么想法吗?

更新:现在我已经重构了它,以便广告商成为要报告的相关实体,我正在尝试找出如何使广告商成为隐藏字段并且无处可去。

我已经尝试了前面提到的 iiirxs 与回调变压器的代码 - 将 'advertiser_id' 更改为 'advertiser' - 但我没有运气。我一直在读这样的帖子Symfony hideType 使用 data_class 作为实体而不是转换器 https://stackoverflow.com/questions/35640543/symfony-hiddentype-using-data-class-for-entity-instead-of-transformer,但我在获取“广告商”的值时遇到了困难,就像他们在该示例中获取 $options['selected_course'] 的方式一样。

当我尝试(出于测试目的)为广告商硬编码值 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_id数据库本身的外键,因此最好使用关联映射。您可以在以下位置找到更多内容文档 https://symfony.com/doc/current/doctrine/associations.html#mapping-the-manytoone-relationship.

但是,如果您确实只需要使用整数来存储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 来实现转换,但您也可以使用转换器类来执行转换。您还可以在以下位置找到更多相关信息数据转换器文档 https://symfony.com/doc/current/form/data_transformers.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 EntityType 显示选择时,无法从 Symfony 表单保存实体 的相关文章

随机推荐