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