Symfony 5 + Doctrine 2 测试环境关联实体未正常加载但开发环境正常
问题原因
你的映射配置本身没有错误,问题出在Doctrine双向关联的内存状态同步逻辑:
Place实体的owner属性是双向关联的 owning side(持有方),User的places是 inverse side(反向方),Doctrine只会校验持有方的变更,不会自动同步反向方的内存数据。- 你测试代码中创建
$place时仅设置了Place的owner属性,内存中已存在的$merchant实例的places集合没有被同步更新,因此调用getPlaces()返回的还是初始化时的空集合。 - 直接调用
findBy()能返回数据是因为该方法直接查询数据库,不依赖当前内存中$merchant实例的状态。
解决方法
按优先级可选以下任意方案:
- 在实体方法中自动维护双向关联(最佳实践)
修改Place实体的setOwner方法,自动同步反向侧的集合:
// Place.php public function setOwner(?User $owner): self { $this->owner = $owner; if ($owner !== null) { $owner->getPlaces()->add($this); } return $this; }
- 手动同步反向关联集合
在createRandomPlace方法中,给Place设置owner后,手动把当前Place实例加入用户的places集合:
// createRandomPlace 方法内 $place->setOwner($merchant); $merchant->getPlaces()->add($place);
- 刷新实体状态
在测试代码中创建完$place后,调用EntityManager的refresh()方法从数据库重新加载$merchant的完整数据:
// 测试方法中,创建$place后新增一行 $em->refresh($merchant);
- 确认User实体初始化了关联集合
检查User构造函数是否初始化了$places属性为集合对象:
// User.php 构造函数 public function __construct() { $this->places = new \Doctrine\Common\Collections\ArrayCollection(); }
内容的提问来源于stack exchange,提问作者Ricardo Martins
相关产品推荐
相关产品推荐

