设置后,Doctrine不会更新cmf SeoBundle对象的属性

问题描述 投票:0回答:1

我使用symfony cmf seoBundle。我的实体类使用SeoAwareTrait。当我尝试更新我的seo属性(我使用下面的代码)时,我得到了旧属性值的结果。

    $entity = $this->galleryManager->findByLink($link);


                $entity->getSeoMetadata()->setTitle($metaTitle);
                $entity->getSeoMetadata()->setMetaDescription($metaDescription);
                $entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

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

当我尝试克隆我的seo属性时,Doctrine成功保存了我的新值:

   $entity = $this->galleryManager->findByLink($link);


                $entity->getSeoMetadata()->setTitle($metaTitle);
                $entity->getSeoMetadata()->setMetaDescription($metaDescription);
                $entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

                $entity->setSeoMetadata(clone $entity->getSeoMetadata());

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

为什么在第二种情况下,学说更新结果,但不是第一种?我是否正确理解该学说不会感知引用其他对象的属性的变化?

php symfony doctrine-orm clone symfony-cmf
1个回答
0
投票

在第一个示例中,您在“getSeoMetadata”的结果上调用方法“setTitle”,“setMetaDescription”,“setMetaKeywords”。这个结果不是$ entity,而是你的excplicity只冲洗$ entity。

看到:

$entity->getSeoMetadata()

返回一些东西(我想是一个对象)并且你在对象上设置的数据不在$ entity上:

$entity->getSeoMetadata()->setMetaKeywords($metaKeywords);

在上面的示例中,在“getSeoMetadata()”的结果上调用“setMetaKeywords()”。你从这种方法中得到了什么?

我会这样做:

$entity = $this->galleryManager->findByLink($link);
$entitySeoMetadata = $entity->getSeoMetadata();

$entitySeoMetadata->setTitle($metaTitle);
$entitySeoMetadata->setMetaDescription($metaDescription);
$entitySeoMetadata->setMetaKeywords($metaKeywords);

/*
* persist only if the item is new. If you have fetched this from doctrine, 
* do not persist it - just flush without persist.
*
* $em->persist($entity); 
*/

$em->flush();
© www.soinside.com 2019 - 2024. All rights reserved.