symfony @oneToMany关系仅返回集合中的最后一个对象

时间:2017-10-13 10:05:49

标签: php symfony orm doctrine

我有一种情况,并不确定我做错了什么。在Sumfony 3.3中,我创建了实体页面和语言之间的关系,其中Page与多种语言相关,当我搜索Page并获取Page对象时,属性Languages返回仅包含最后一个Language对象的集合。无论集合中有多少个对象,它总是最后返回。

页面实体:

/**
 * @ORM\OneToMany(targetEntity="Language", mappedBy="page", cascade={"ALL"}, indexBy="page_id")
 */
private $languages;

语言实体:

/**
 * @ORM\ManyToOne(targetEntity="Page", inversedBy="languages")
 */
private $page;

public function addLanguage(\AppBundle\Entity\Langaugee $language)
{
    $this->languages[] = $language;

    return $this;
}

public function removeLanguage(\AppBundle\Entity\Language $language)
{
    $this->$languages->removeElement($language);
}

public function getLanguages()
{
    return $this->languages;
}

页面对象在PageService:

中获取
public function getPageByName($name)
{
return $this->pageRepository->findBy(array("name"=>$name));
}

由于属性$ languages默认设置为lazy,JMS序列化程序在序列化Page对象时提取语言集合

有人有这个问题吗?

2 个答案:

答案 0 :(得分:0)

经过彻底调试后,我发现indexBy在这里被误用了。定义的indexBy = page_id始终提供相同的值,因此每个映射到SimpleObjectHydrator中的实体的记录都会溢出现有记录,只留下最后添加的语言对象集合

答案 1 :(得分:0)

我知道它是一个老帖子,但是下面的解决方案对我有用。

在获取数据之前,我必须通过调用此方法来清除存储库类方法中的EntityManager缓存。

$this->_em->clear();

此处_em是存储库类中可用的默认EntityManager