0

我有一个带有“标题”字段的表,我正在尝试获取该表中的所有行,并按标题 ASC 对它们进行排序。我正在测试的四条记录的标题是:

另一个测试

我的新页面

新的

啊啊啊

这也是返回行的顺序,这是不正确的。'aaa' 应该在列表的顶部。我认为问题出在小写和大写字符上。

我想按 LOWER(title) 而不是按标题订购,但是我在 FuelPHP 中进行这项工作时遇到问题。

我用来选择记录的代码是:

$pages = Model_pages::find('all', array(
    'order_by' => array('title' => 'asc')
));

无论他们的“案例”如何,我如何在订单项目上方制作代码?

编辑:

@Uru,感谢您的反馈:) 我尝试了以下代码,所有变体都会导致 SQL 或 PHP 错误:

$pages = Model_pages::find('all', array(
    'order_by' => \DB::expr('LOWER(title) ASC')
));

$pages = Model_pages::find('all', array(
    'order_by' => \DB::expr('LOWER(title)')
));

$pages = Model_pages::find('all', array(
    'order_by' => \DB::expr('LOWER(title) ASC')
));

$pages = Model_pages::find('all', array(
    'order_by' => array( \DB::expr('LOWER(title)') )
));

$pages = Model_pages::find('all', array(
    'order_by' => array( \DB::expr('LOWER(title) ASC') )
));

$pages = Model_pages::find('all', array(
    'order_by' => array( \DB::expr('LOWER(title)') => 'ASC' )
));
4

2 回答 2

0

您应该能够使用DB::expr('LOWER(title)')转义表达式并使用它而不是'title'.

如果这不起作用并且文档中没有任何内容,则当前不支持此功能。

于 2014-09-17T13:46:09.677 回答
0

问题在于 MySQL 中的数据库排序规则,将其更改为 utf8_general_ci 解决了该问题。感谢 FuelPHP 论坛上的 Harro 回答了这个问题:

你在使用 MySQL 吗?如果是这样,您对表格使用什么整理顺序?

MySQL 作为最后带有“ci”的整理序列(如 utf8_general_ci),“不区分大小写”。这意味着“aaa”和“AAA”的排序相同。

如果您想知道究竟执行了什么 SQL,请在 config.php 中将 'profiling' 设置为 true,并在 /db.php 中的数据库定义中将其设置为 true。

您将在页面的右下角看到一个黑色的小分析器,如果单击它,分析器将打开,它会显示所有已执行的 SQL 查询。

据我所知,您的 ORM 代码没有任何问题,但我从不使用数组表示法。我会使用(应该生成相同的 SQL):

$pages = Model_pages::query()->order_by('title', 'asc')->get();

对于遇到相同问题的任何人,都可以在此处找到完整的线程:

http://fuelphp.com/forums/discussion/13226/fuelphp039s-orm-isn039t-ordering-items-correctly

于 2014-09-17T22:44:53.587 回答