Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系

Posted

技术标签:

【中文标题】Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系【英文标题】:Duplicate OneToOne relation by Doctrine and SymfonySeoBundle 【发布时间】:2017-06-16 01:31:06 【问题描述】:

我在这篇文章 http://symfony.com/doc/current/cmf/bundles/seo/seo_aware.html 之后将 SEO 数据添加到我的实体。

    class Provider implements SeoAwareInterface
    
        /**
         * @var SeoMetadataInterface
         *
         * @ORM\OneToOne(targetEntity="Symfony\Cmf\Bundle\SeoBundle\Model\SeoMetadata", cascade="persist","remove")
         * @ORM\JoinColumn(name="seo_metadata_id", referencedColumnName="id")
         */
        protected $seoMetadata;
    

我使用 SonataAdmin 编辑 Provider 实体,并为 seoMetadata 属性使用特殊表单类型 - SeoMetadataType (http://symfony.com/doc/current/cmf/bundles/seo/seo_aware.html#form-type)

protected function configureFormFields(FormMapper $form)

    $form
        // some entity related fields
        ->with('form.provider.seo_group_title', [
            'class' => 'col-md-4',
        ])
            ->add('seoMetadata', SeoMetadataType::class, [], [
                'generic_metadata' => false,
            ])
        ->end()
    ;

接下来是问题 - 每次我编辑 Provider 实体时,我都会获得 SeoMetadata 的新记录。

我已经调试了更新过程,在persistflush 操作之前我在$seoMetadata 属性中有SeoMetadata 的代理,并且存在id,但是在persistflush 操作之后我看到了代理新的id 和表中的新记录。

有人知道怎么回事吗?

【问题讨论】:

【参考方案1】:

我们确实有一些 ORM 示例,但并不完全支持 atm。但是您能否仅通过在此处添加一些代码来重现您的持久性问题:https://github.com/symfony-cmf/seo-bundle/blob/master/tests/Functional/Doctrine/Orm/SeoMetadataTest.php 只需做一个 PR,我会尝试修复它。但也可能是奏鸣曲或形式上的问题。

【讨论】:

以上是关于Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 和 LIKE 查询

Doctrine 查询缓存和更新

Doctrine2 关联持久性

PHP-Doctrine2: Items - Shops - ItemsAtShops - 如何使用Doctrine2方便地实现?

Doctrine2 - 一次多次插入

Doctrine 的 findBy*() 中的 LIKE 和 % 通配符