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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:17