Я просил это вчера: SQL Ordering Data from row "n+1" to "n-1"Дата заказа от п + 1 до п-1 в Doctrine2
Но я использую doctrine2 и в DQL, дело заявление не доступно. Итак, как я мог это сделать в DQL?
Спасибо!
(я использую учение в Symfony2)
Я просил это вчера: SQL Ordering Data from row "n+1" to "n-1"Дата заказа от п + 1 до п-1 в Doctrine2
Но я использую doctrine2 и в DQL, дело заявление не доступно. Итак, как я мог это сделать в DQL?
Спасибо!
(я использую учение в Symfony2)
Сортировать их на стороне 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
)
Это может быть, вероятно, сделать короче и более эффективным способом, но если вы не собираетесь сортировать сотни объектов это не имеет значения. По крайней мере, код прост и удобен в обслуживании.
Да, возможно. Спасибо. Но не плохая практика заказывать данные на стороне php? –
Это прекрасно, если вы также не устанавливаете данные на стороне php. – Crozin
Вы можете просто пройти plain SQL через доктрину. Это должно быть быстрее, чем сортировка объектов в PHP.
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.
Вы попытались положить футляр в порядок, '-> orderBy ('CASE WHEN ID> 4 THEN 0 ELSE 1 END', 'ASC');' –