0

LEFT 結合を使用しているため、メッセージ テーブルの is_read 列に null 値が返されます。注文時にヌルを一番下に保ちたい。これをページネーターで使用しています。以下は、同じことを行うための私のコードです。

$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 関数が省略されています。また、可能であれば、カスタム pagination() を使用せずにこれを達成する方法を提案してください。

4

1 に答える 1

1

ページネーション コンポーネントを使用している場合、集計関数が order 句で機能しませんでした。Message モデルで仮想フィールドを次のように宣言しようとしました。

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

最後に、Message モデルでそれを仮想フィールドとして宣言すると、うまくいきました。みんなありがとう。

于 2013-10-10T07:17:08.137 に答える