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

Symfony4:如何通过Query Builder获取实体对象

解决Call to a member function getPropertyName() on array的问题

问题原因

你当前用原生SQL查询后调用fetchAll(),返回的是关联数组而非Doctrine实体对象,自然无法调用实体类的getPropertyName()方法。你提到想用Query Builder,这才是获取实体对象的正确方向~

解决方案1:使用Doctrine Query Builder(推荐)

直接利用Repository的createQueryBuilder方法,它会自动返回实体对象集合:

public function findByYear($year): array {
    return $this->createQueryBuilder('r')
        ->andWhere('YEAR(r.date) = :year')
        ->setParameter('year', $year)
        ->getQuery()
        ->getResult();
}

这样返回的是RentRelease实体对象的数组,你就可以正常调用$entity->getPropertyName()了。

解决方案2:原生SQL映射为实体(如果必须用原生SQL)

如果因为特殊场景必须使用原生SQL,可以通过ResultSetMapping把查询结果映射为实体:

use Doctrine\ORM\Query\ResultSetMapping;

public function findByYear($year): array {
    // 创建结果集映射,关联到你的实体类
    $rsm = new ResultSetMapping();
    $rsm->addEntityResult(RentRelease::class, 'r');
    // 逐个映射实体字段和数据库列,替换成你的实际字段
    $rsm->addFieldResult('r', 'id', 'id');
    $rsm->addFieldResult('r', 'date', 'date');
    $rsm->addFieldResult('r', 'property_name', 'propertyName');

    $sql = 'SELECT * FROM rent_release r WHERE YEAR(`date`) = :yearRequested';
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    $query->setParameter('yearRequested', $year);

    return $query->getResult();
}

额外提示

如果你坚持使用原生数组结果,那需要用数组索引访问属性,比如$item['property_name'],但这显然不是你想要的实体调用方式,所以优先考虑前两种方案。

内容的提问来源于stack exchange,提问作者Tom Paler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:28:47