我正在尝试在Symfony2中使用Doctrine2 v. 2.1.7执行此操作:
$query = $this->em->createQuery(
"SELECT a
FROM ".$repo." a
WHERE a.type_id = :typeid
AND a.scenario = :scen
AND a.contact_id = :cid
AND a.row_type LIKE :rwtp
ORDER BY SUBSTRING(a.row_type, 4, 1) "
)->setParameters(
array(
'typeid' =>$sesData['type_id'],
'scen' =>$sesData['scenario'],
'cid' =>$sesData['contact_id'],
'rwtp' =>'%.'.$whereVal.'%'
)
);
$customValues = $query->getResult();
原则 2 在 ORDER BY 子句上失败,因为它不喜欢其中的任何内容,除了列名和它出现的排序方向。
我已经查看了使用本机查询的文档,但这不起作用,因为此查询用于从多个表中提取数据(它位于我们使用的全局方法中),所以我无法执行映射工作,因为除了上面的 where 子句之外,其余的列名因表而异。
我认为为了实现这一目标,我将需要一个真正的本机查询,该查询像所有其他非本机 DQL 查询一样自动执行映射(水合?但这部分让我感到困惑。
我可以尝试什么来让它工作?
如何创建另一列,其中已经存储了SUBSTRING(a.row_type, 4, 1)
的结果,例如在插入时,映射该列并按此排序?无论如何,与计算每行每个查询的子字符串相比,它会更有效。
效率会降低,但是您是否考虑过在从数据库中取回结果后使用其中一个php排序函数自己对结果进行排序的可能性?如果结果集不是很大,这可能是一种明智的方法。
试试这个:
SELECT a, SUBSTRING(a.row_type, 4, 1) AS row_type
FROM ".$repo." a
WHERE a.type_id = :typeid
AND a.scenario = :scen
AND a.contact_id = :cid
AND a.row_type LIKE :rwtp
ORDER BY row_type