Symfony查询候选人平均面试评分时出现未定义方法错误求助
解决方案
出现getAverageRating未定义的错误,核心原因是你在QueryBuilder中自定义了average_rating计算字段,但Candidates实体类中没有对应的属性和Getter方法,Doctrine无法将查询结果注入到实体对象中。以下是具体解决步骤:
1. 在Candidates实体中添加非持久化属性及Getter
打开App\Entity\Candidates类,添加两个非持久化属性(不需要数据库映射注解),并生成对应的Getter方法:
// App\Entity\Candidates.php private ?float $averageRating = null; private ?int $applied = null; /** * 获取平均面试评分 */ public function getAverageRating(): ?float { return $this->averageRating; } /** * 获取申请次数 */ public function getApplied(): ?int { return $this->applied; } // 可选:添加Setter方法,Doctrine会自动赋值,无需手动调用 public function setAverageRating(?float $averageRating): self { $this->averageRating = $averageRating; return $this; } public function setApplied(?int $applied): self { $this->applied = $applied; return $this; }
Doctrine会自动将QueryBuilder中average_rating(下划线命名)的查询结果,映射到实体的驼峰式属性$averageRating上,此时调用getAverageRating()就不会报错了。
2. (可选)优化QueryBuilder性能
当前写法中每个候选人都会触发两次子查询,数据量大时性能较差,建议改用JOIN + GROUP BY的方式一次性计算:
$qb = $this->createQueryBuilder('c') ->leftJoin('c.created_by_name', 'u') ->leftJoin('App\Entity\Interviews', 'i', 'WITH', 'c.candidate_id = i.candidate_id') ->leftJoin('App\Entity\CandidatesInvitations', 'ci', 'WITH', 'c.candidate_id = ci.candidate_id') ->select('c', 'AVG(i.interview_rating) as averageRating', 'COUNT(DISTINCT ci.id) as applied') ->groupBy('c.candidate_id') ->setFirstResult($offset) ->setMaxResults($params["limit"]);
这种写法只需要一次查询就能完成所有计算,性能更优,且依然可以通过上面添加的Getter方法获取结果。
内容的提问来源于stack exchange,提问作者Nauman Ghauri
相关产品推荐
相关产品推荐

