まとめ: ORDER BY parent_id = id DESC
Doctrine でできることはありますか?
Category
階層記事カテゴリを含むデータベース テーブルがあります。テーブルは次のようになります。
CREATE TABLE IF NOT EXISTS `Category` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) default NULL,
`name` varchar(255) collate utf8_unicode_ci NOT NULL,
`sort` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_FF3A7B97727ACA70` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=22 ;
階層の深さは 1 レベルのみで、トップ レベルは とparent_id
同じであると識別されますid
。
Doctrine QueryBuilder (DQL でも同様) を使用してすべての行をフェッチし、すべてのカテゴリが連続してリストされるようにします。カテゴリの親が最初で、その子がすぐ後に続きます。このような:
id parent_id sort name
-----------------------------------
1 1 1 Animals
5 1 1 Cat
10 1 3 Dog
9 1 2 Walrus
2 2 2 Fruits
13 2 3 Apple
12 2 2 Pear
11 2 1 Melon
3 3 3 Vehicles
15 3 2 Car
6 3 3 Train
14 3 1 Paraglider
このネイティブの MySQL クエリを使用して、必要な順序で項目を取得できます。
select * from Category order by parent_id asc, parent_id = id desc;
ただし、QueryBuilder または DQL でそれを行う方法はわかりません。問題は、parent_id = id
DQL でエラーになる並べ替え条件です。[Syntax Error] line 0, col 109: Error: Expected end of string, got '='
回避策はあり$em->createNativeQuery()
ますが、ORM の方法でこれを行う適切な方法を見つけたいと考えています。