我昨天请求了这个: SQL Ordering Data from row "n+1" to "n-1"
但我使用的是doctrine2,并且在DQL 中,Case 语句不可用。那么我怎么能在 DQL 中做到这一点呢?
谢谢 !
(我在 symfony2 中使用学说)
我昨天请求了这个: SQL Ordering Data from row "n+1" to "n-1"
但我使用的是doctrine2,并且在DQL 中,Case 语句不可用。那么我怎么能在 DQL 中做到这一点呢?
谢谢 !
(我在 symfony2 中使用学说)
您可以通过教义传递纯 SQL 。这应该比在 PHP 中对对象进行排序要快得多。
在 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
)
它可能会以更短且更有效的方式完成,但除非您要对数百个对象进行排序,否则这无关紧要。至少代码简单且易于维护。
顺便说一句,Doctrine 的 DQL 中存在CASE 表达式。...但没有那么好记录。
您还可以使用以下方法在您的实体中创建一个命名的本机查询:
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
{
// ....
}
否则,您可以引入自定义 DQL 函数。