我使用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();
为什么在第二种情况下该学说会更新结果,而在第一种情况下却不会呢?我是否正确地理解了该学说不会感知到引用其他对象的属性的变化?
答案 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();