摘要:在Doctrine中,我们能否使用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方式来实现这一点。
WHERE
的情况下运行良好,并产生我们想要的结果。我们只是想不使用原生MySQL查询来完成它。 - Kaivosukeltajaparent_id
排序,其次按其parent_id
是否与其id
相同排序。 - KaivosukeltajaCASE
会导致Doctrine错误(“预期文字,得到CASE”)。 - KaivosukeltajacreateNativeQuery
。 - Kaivosukeltaja