1

我昨天请求了这个: SQL Ordering Data from row "n+1" to "n-1"

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

谢谢 !

(我在 symfony2 中使用学说)

4

3 回答 3

0

您可以通过教义传递纯 SQL 。这应该比在 PHP 中对对象进行排序要快得多。

于 2013-06-16T11:38:08.830 回答
0
  1. 从数据库中获取第 n对象。
  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
    )
    

它可能会以更短且更有效的方式完成,但除非您要对数百个对象进行排序,否则这无关紧要。至少代码简单且易于维护。

于 2013-06-16T10:17:01.090 回答
0

顺便说一句,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 函数

于 2013-06-16T12:30:13.413 回答