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

时间:2019-04-25 15:03:14

标签: php symfony doctrine-orm clone symfony-cmf

我使用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();

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

1 个答案:

答案 0 :(得分:0)

在第一个示例中,对“ getSeoMetadata”的结果调用方法“ setTitle”,“ setMetaDescription”,“ setMetaKeywords”。 此结果不是$ entity,但是您的专长只会刷新$ 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();