2013-10-09 41 views
0

我正在使用LEFT连接,结果在Messages表中获取is_read列的空值。订购时,我希望将零位保持在底部。我在paginator中使用这个。以下是我做同样的代码:ISNULL在CAKEPHP中无法正常工作

$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

为什么您同时基于'ISNULL(x)'和'x'进行排序?也许你想'IFNULL(x,0)'。 – tadman

+0

我试图用IFNULL(x,0)来做到这一点,但那也不起作用。如果我只是使用IFNULL(Message.is_read,0),那么这个order by子句从结果查询中被省略。 –

+0

在没有任何聚合函数的情况下,使用GROUP BY是不合适的。也许你打算使用'DISTINCT'运算符。 – Strawberry

回答

1

使用分页组件时,聚合函数在顺序子句中不起作用。我试着在消息模型声明一个虚拟的领域为:

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

因此,最后,它声明为虚拟领域的消息模型做了工作。 谢谢大家。