3

まとめ: ORDER BY parent_id = id DESCDoctrine でできることはありますか?

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 = idDQL でエラーになる並べ替え条件です。[Syntax Error] line 0, col 109: Error: Expected end of string, got '='

回避策はあり$em->createNativeQuery()ますが、ORM の方法でこれを行う適切な方法を見つけたいと考えています。

4

2 に答える 2

0

このクエリを試してください

SELECT *, CASE id WHEN parent_id THEN 1 ELSE 0 END AS custom_order
FROM Category 
WHERE ORDER BY parent_id ASC, custom_order DESC;
于 2012-11-23T14:17:49.640 に答える
0

私の評判では、aykut からの回答についてコメントすることはできませんが、トピック ポスターとまったく同じ問題があり、CASE ステートメントがそれをうまく解決したことを指摘したかっただけです。

Kaivosukeltaja は、CASE を使用すると Doctrine エラーが発生すると報告していますが、私の場合は :-) これは起こりませんでした。バージョン 2.2 以降に CaseExpressions が追加されたようです: https://github.com/doctrine/doctrine2/commit/816ce41f638d28934c79a12ef27f954124b2639e

于 2013-08-02T05:43:00.333 に答える