[cakePHP]findの戻り値からモデル名を除去する

cakephpでModel->find(‘all’); をつかうと、検索結果を取得することができる。
この結果を

$this->set('results',$this->Model->find('all'));
$this->set('status','ok');

という具合にパラメタにセットして、

 protected function return_as_json(){
$this->header('Content-Type: text/html');
echo $this->indent( json_encode($this->viewVars) );
exit();
}

というような関数を呼び出してあげれば、検索結果をJSONで返すWebAPI的なものを作ることができる。

ところがこれがちょっと変で。JavaScriptからみた戻り値はこんなふうに見える。

{
"results": [
{
"Model": {
"id": "5",
"user_id": "8",
   :(略)
}
},
{
"Model": {
"id": "4",
"user_id": "8",
   :(略)
}
},
],
"status": "ok"
}

普通APIで検索結果を取得する時って、普通こうなってません?

{
"results": [
{
"id": "5",
"user_id": "8",
   :(略)
},
{
"id": "4",
"user_id": "8",
   :(略)
},
],
"status": "ok"
}

呼び出し側のJavaScriptから見たら、

function(res){//success
var models = res['results'];
for (var i = 0; i < models.length; i++) {
console.log(models[i]['Model'].id)
}
}

って謎の型名をつけるよりも、

function(res){//success
var models = res['results'];
for (var i = 0; i < models.length; i++) {
console.log(models[i].id)
}
}

のほうが自然ですよね。

前置きが長くなったけれど、そういうわけで型名を付けないで検索結果を返すようにする実装。
本当はjson_encodeするときに型名を落とすのが適切だと思うのだけれど、うまいやり方を思いつかなかったので、modelのカスタムfindとして定義してみた。

連想配列のまま構造を変えるのではなくて、一旦フラットにしてテキストとしてモデル名を除去しています。

allの代わりにnoModelNameを使えば、モデル名部分のないハッシュを得ることができます。

 $this->set('results', $this->Model->find('noModelName') );
$this->return_as_json();

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です