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
相关产品推荐
相关产品推荐

