ISNULL在CAKEPHP中没有按顺序工作

时间:2013-10-09 14:06:31

标签: mysql cakephp-2.0

我正在使用LEFT连接,因此在Messages表中获取is_read列的空值。我想在订购时将空值保持在底部。我在分页器中使用它。以下是我做同样的代码:

$this->Paginator->settings = array(
        'fields' => array('User.*'),
        'joins' => array(
            array('table' => 'messages',
                'alias' => 'Message',
                'type' => 'LEFT',
                'conditions' => array(
                    'User.id = Message.user_from_id'
                )
            ),
        ),
        'limit' => 20,
        'group' => array('User.id'),
        'order' => array('ISNULL(Message.is_read)' => 'asc','Message.is_read' => 'asc', 'Message.created' => 'asc'),
    );

Cakephp为此生成的查询如下:

SELECT `User`.*, (CONCAT(`User`.`first_name`, ' ', `User`.`last_name`)) AS `User__full_name` FROM `srs_development`.`users` AS `User` LEFT JOIN `srs_development`.`messages` AS `Message` ON (`User`.`id` = `Message`.`user_from_id`) WHERE 1 = 1 GROUP BY `User`.`id` ORDER BY `Message`.`is_read` asc, `Message`.`created` asc LIMIT 20

ISNULL函数在最终查询中被省略。 如果可能的话,请在不使用自定义分页()的情况下建议一种方法来实现此目的。

1 个答案:

答案 0 :(得分:1)

使用分页组件时,聚合函数在order子句中不起作用。我尝试在Message模型中将虚拟字段声明为:

public $virtualFields = array(
'sortme' => "ISNULL(Message.is_read)",
);

最后,在Message模型中将其声明为虚拟字段完成了这项工作。 谢谢大家。