我使用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();
为什么在第二种情况下,学说更新结果,但不是第一种?我是否正确理解该学说不会感知引用其他对象的属性的变化?
在第一个示例中,您在“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();