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();