总结:我们可以在教义中做ORDER BY parent_id = id DESC
吗?
我们有一个数据库表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 ;
层次结构仅深一级,顶层标识其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方式执行此操作。
尝试此查询
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;
我的声誉不允许我对aykut的答案发表评论,但我只是想指出,我遇到了与主题海报完全相同的问题,CASE语句很好地解决了它。
Kaivosukeltaja报告说,使用CASE会导致教义错误,但就我而言:-)这没有发生。似乎从 2.2 版开始添加了 CaseExpressions:https://github.com/doctrine/doctrine2/commit/816ce41f638d28934c79a12ef27f954124b2639e