CakePHP 2系でfindとかでフィールド名に別名をつけるとき


CakePHPのpaginateで別名をつけた時に取得結果が使いにくかったのでメモ

通常

$this->paginate = array(
    'ErrorLog' => array(
        'conditions' => array(
            'ErrorLog.delete_flag' => false
        ),
        'fields' => array(
            'ErrorLog.email',
            'count(ErrorLog.error_log_id) AS error_count',
        ),
        'group' => 'ErrorLog.email',
        'limit' => 20
    )
);

のように別名をつけると

Array
(
    [0] => Array
    (
        [ErrorLog] => Array
        (
            [email] => hugahuga@example.ne.jp
        )
        [0] => Array
        (
            [error_count] => 3
        )
    )
    [1] => Array
    (
        [ErrorLog] => Array
        (
            [email] => hogehoge@example.ne.jp
        )
        [0] => Array
        (
            [error_count] => 1
        )
    )
)

のように別々の配列になってしまう。
これだとView側で使うときにちょっと面倒なのでどうにかできないかと調べるとModel名+__アンダースコア2つで配列を一緒にできるらしいので試しにやってみた。

$this->paginate = array(
    'ErrorLog' => array(
        'conditions' => array(
            'ErrorLog.delete_flag' => false
        ),
        'fields' => array(
            'ErrorLog.email',
            'count(ErrorLog.error_log_id) AS ErrorLog__error_count',
        ),
        'group' => 'ErrorLog.email',
        'limit' => 20
    )
);

ちょっと長ったらしい別名になってしまったが気にしない
で、結果が

Array
(
    [0] => Array
    (
        [ErrorLog] => Array
        (
            [email] => hugahuga@example.ne.jp
        )
        [errorlog] => Array
        (
            [error_count] => 3
        )
    )
    [1] => Array
        (
        [ErrorLog] => Array
        (
            [email] => hogehoge@example.ne.jp
        )
        [errorlog] => Array
        (
            [error_count] => 1
        )
    )
)

ちょっと惜しい。。。
折角Model名を指定したのに全て小文字になってしまっている。
吐き出されたSQLを眺めててもしやと思って以下のように変更。

$this->paginate = array(
    'ErrorLog' => array(
        'conditions' => array(
            'ErrorLog.delete_flag' => false
        ),
        'fields' => array(
            'ErrorLog.email',
            'count(ErrorLog.error_log_id) AS "ErrorLog__error_count"',
        ),
        'group' => 'ErrorLog.email',
        'limit' => 20
    )
);

別名を「”」ダブルコーテーションで囲ってあげたところ

Array
(
    [0] => Array
    (
        [ErrorLog] => Array
        (
            [email] => hugahuga@example.ne.jp
            [error_count] => 3
        )
    )
    [1] => Array
    (
        [ErrorLog] => Array
        (
            [email] => hogehoge@example.ne.jp
            [error_count] => 1
        )
    )
)

うまくModel名に変更された。
めでたしめでたし。
CakePHPのドキュメントでhttp://book.cakephp.org/2.0/en/models/virtual-fields.html
バーチャルフィールドを追加すればいいと書いてあったがバージョン2.1.3では上手くいかなかった。。。なんで。。。


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>