Symfony中Doctrine QueryBuilder查询结果模板调用报错问题
问题解决方案
问题根源
你遇到的报错和实体的getId()方法无关,核心原因是:Doctrine默认会将查询结果映射为ReferralEntity对象,但你的统计查询返回的是自定义统计字段totalReferral+referrer_id,而ReferralEntity中并没有定义$totalReferral属性及对应的getTotalReferral()方法,所以Twig模板无法直接访问该字段。
三种可行解决办法
1. 以数组形式返回查询结果
修改getTotalReferrals()方法,指定Doctrine以数组格式返回结果,这样就能直接在Twig中通过数组键名访问totalReferral:
public function getTotalReferrals() { return $this->createQueryBuilder('r') ->select('COUNT(r.id) AS totalReferral', 'r.referrer_id') ->where('r.status = :status') ->setParameter('status', 'Completed') ->groupBy('r.referrer_id') ->orderBy('totalReferral', 'DESC') ->getQuery() ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); // 关键:启用数组 hydration }
Twig模板中使用:
{% for item in totalReferrals %} 推荐人ID: {{ item.referrer_id }},总推荐数: {{ item.totalReferral }} {% endfor %}
2. 给实体添加临时属性与Getter方法
如果需要保持对象返回格式,可以在ReferralEntity中添加临时属性和对应的访问方法,Doctrine会自动将查询结果的totalReferral字段映射到该属性:
// ReferralEntity.php private ?int $totalReferral = null; public function getTotalReferral(): ?int { return $this->totalReferral; } public function setTotalReferral(?int $totalReferral): self { $this->totalReferral = $totalReferral; return $this; }
Twig模板中直接调用Getter方法:
{% for item in totalReferrals %} 推荐人ID: {{ item.referrerId }},总推荐数: {{ item.totalReferral }} {% endfor %}
3. 使用DTO(数据传输对象)承载统计结果
创建专门的DTO类来封装统计数据,这种方式更符合代码规范,避免污染实体类:
// src/Dto/ReferralStatsDTO.php namespace App\Dto; class ReferralStatsDTO { public function __construct( public int $totalReferral, public int $referrerId ) {} }
修改查询方法,指定返回DTO对象:
public function getTotalReferrals() { return $this->createQueryBuilder('r') ->select('new App\Dto\ReferralStatsDTO(COUNT(r.id), r.referrer_id)') ->where('r.status = :status') ->setParameter('status', 'Completed') ->groupBy('r.referrer_id') ->orderBy('totalReferral', 'DESC') ->getQuery() ->getResult(); }
Twig模板中访问:
{% for item in totalReferrals %} 推荐人ID: {{ item.referrerId }},总推荐数: {{ item.totalReferral }} {% endfor %}
内容的提问来源于stack exchange,提问作者Jim Mike
相关产品推荐
相关产品推荐

