在Doctrine2中订购从n + 1到n-1的日期

时间:2013-06-16 09:29:54

标签: mysql symfony doctrine-orm dql

我昨天要求这样做: SQL Ordering Data from row "n+1" to "n-1"

但我使用的是doctrine2,在DQL中,Case语句不可用。那我怎么能在DQL中做到这一点?

谢谢!

(我在symfony2中使用doctrine)

3 个答案:

答案 0 :(得分:0)

  1. 从数据库中获取 th 对象。
  2. 从按ID排序的数据库中获取所有对象。
  3. 在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
    )
    
  4. 它可能更短,更有效,但除非您要对数百个物体进行分类,否则它无关紧要。至少代码简单易维护。

答案 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