如何访问Doctrine QueryBuilder联合查询返回的关联实体属性数据
访问关联Ingredient属性的实现方法
你当前写的查询逻辑是正确的,leftJoin搭配addSelect已经完成了Dish与关联Ingredient的预加载,返回结果为去重后的Dish实体对象数组,每个Dish实例已经持有对应关联的Ingredient集合,直接通过实体方法遍历访问即可。
代码示例
// 调用仓库方法获取结果集 $dishList = $this->dishRepository->findMealsByDish($meal); foreach ($dishList as $dish) { // 访问Dish自身属性 $dishName = $dish->getName(); // 遍历关联的食材集合,OneToMany关联默认返回Doctrine ArrayCollection实例 foreach ($dish->getIngredients() as $ingredient) { // 调用Ingredient实体的getter方法获取对应属性 $ingredientName = $ingredient->getName(); $ingredientUnit = $ingredient->getUnit(); $ingredientQuantity = $ingredient->getQuantity(); // 后续业务逻辑处理 } }
注意事项
- 先确认Dish实体中已经配置了正确的OneToMany关联,存在
$ingredients属性与对应的getIngredients()方法 - 用
dd()打印时如果看到$ingredients显示为PersistentCollection是正常现象,你已经通过addSelect预加载了关联数据,遍历访问时不会产生额外的N+1查询 - 不要尝试直接把实体对象转数组取属性,通过实体类定义的getter方法访问是Doctrine实体的标准用法
内容的提问来源于stack exchange,提问作者ch3ssnut
相关产品推荐
相关产品推荐

