2013-06-16 3 views
1

Я просил это вчера: SQL Ordering Data from row "n+1" to "n-1"Дата заказа от п + 1 до п-1 в Doctrine2

Но я использую doctrine2 и в DQL, дело заявление не доступно. Итак, как я мог это сделать в DQL?

Спасибо!

(я использую учение в Symfony2)

+0

Вы попытались положить футляр в порядок, '-> orderBy ('CASE WHEN ID> 4 THEN 0 ELSE 1 END', 'ASC');' –

ответ

0
  1. Fetch п й объект из базы данных.
  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 
    ) 
    

Это может быть, вероятно, сделать короче и более эффективным способом, но если вы не собираетесь сортировать сотни объектов это не имеет значения. По крайней мере, код прост и удобен в обслуживании.

+0

Да, возможно. Спасибо. Но не плохая практика заказывать данные на стороне php? –

+0

Это прекрасно, если вы также не устанавливаете данные на стороне php. – Crozin

0

Вы можете просто пройти plain SQL через доктрину. Это должно быть быстрее, чем сортировка объектов в PHP.

0

CASE expressions есть в Dct доктрины Doctrine. ... но не так хорошо документированы.

вы можете как хорошо создать именованный родной запрос в вашей организации с помощью:

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.

Смежные вопросы