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では上手くいかなかった。。。なんで。。。