我昨天要求这样做: SQL Ordering Data from row "n+1" to "n-1"
但我使用的是doctrine2,在DQL中,Case语句不可用。那我怎么能在DQL中做到这一点?
谢谢!
(我在symfony2中使用doctrine)
答案 0 :(得分:0)
在PHP端对它们进行排序:
<?php
$objects = range(1, 10); // objects from 2nd point
$object = 6; // object from 1st point
$result = $higher = $lower = array();
foreach ($objects as $o) {
if ($o < $object) {
$lower[] = $o;
} else if ($o > $object) {
$higher[] = $o;
}
}
$result = array_merge($higher, $lower);
print_r($result);
输出:
Array
(
[0] => 7
[1] => 8
[2] => 9
[3] => 10
[4] => 1
[5] => 2
[6] => 3
[7] => 4
[8] => 5
)
它可能更短,更有效,但除非您要对数百个物体进行分类,否则它无关紧要。至少代码简单易维护。
答案 1 :(得分:0)
你可以通过学说传递plain SQL。这应该比在PHP中对对象进行排序更快。
答案 2 :(得分:0)
CASE expressions存在于Doctrine的DQL顺便说一句。 ......但没有那么好记录。
您还可以使用以下命令在您的实体中创建命名的本机查询:
namespace MyProject\Model;
/**
* @ORM\NamedNativeQueries({
* @ORM\NamedNativeQuery(
* name = "customOrderAddresses",
* resultClass = "Address",
* query = "SELECT ID FROM adresses WHERE ID <> ? ORDER BY CASE WHEN ID > ? THEN 0 ELSE 1 END, ID"
* ),
* })
*/
class Address
{
// ....
}
否则你可以引入custom DQL function。