You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:47:02