为什么 Doctrine 的 "NativeQuery" return 为空结果集?
Why does Doctrine's "NativeQuery" return empty result set?
如果我使用 Doctrine 的 NativeQuery
来执行一些奇异的 PostgreSQL 查询,我会得到空的结果集。例如,假设以下代码来自实体
的存储库 class
// src/Repository/FooRepository.php
class FooRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Foo::class);
}
/**
* @return Foo[] Returns an array of Foo objects
*/
public function findBySomething(string $something)
{
$rsm = new ResultSetMapping();
$nq = $this->getEntityManager()->createNativeQuery(
'SELECT * FROM foo WHERE column ->> \'key\' = :param',
$rsm
);
$nq->setParameter(':param', $something);
return $nq->getResult();
}
}
现在,当我从控制器调用此方法时,我得到 []
。为什么?
因为你告诉 Doctrine return 清空结果。如何?您已实例化 ResultSetMapping
,但未对其进行配置。如果你想要结果作为 Foo
对象的数组,你需要配置这个结果集。在 $rsm
实例之后添加以下行:
$rsm = new ResultSetMapping();
$rsm->addEntityResult(Foo::class, 'f');
$rsm->addFieldResult('f', 'id', 'id');
就是这样。现在你真的会得到一个 Foo
对象的数组。
如果我使用 Doctrine 的 NativeQuery
来执行一些奇异的 PostgreSQL 查询,我会得到空的结果集。例如,假设以下代码来自实体
// src/Repository/FooRepository.php
class FooRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Foo::class);
}
/**
* @return Foo[] Returns an array of Foo objects
*/
public function findBySomething(string $something)
{
$rsm = new ResultSetMapping();
$nq = $this->getEntityManager()->createNativeQuery(
'SELECT * FROM foo WHERE column ->> \'key\' = :param',
$rsm
);
$nq->setParameter(':param', $something);
return $nq->getResult();
}
}
现在,当我从控制器调用此方法时,我得到 []
。为什么?
因为你告诉 Doctrine return 清空结果。如何?您已实例化 ResultSetMapping
,但未对其进行配置。如果你想要结果作为 Foo
对象的数组,你需要配置这个结果集。在 $rsm
实例之后添加以下行:
$rsm = new ResultSetMapping();
$rsm->addEntityResult(Foo::class, 'f');
$rsm->addFieldResult('f', 'id', 'id');
就是这样。现在你真的会得到一个 Foo
对象的数组。