PHP: 2013年5月アーカイブ

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


このアーカイブについて

このページには、 2013年5月 以降に書かれたブログ記事のうち PHP カテゴリに属しているものが含まれています。

前のアーカイブは PHP: 2013年4月 です。

最近のコンテンツは インデックスページ で見られます。過去に書かれたものは アーカイブのページ で見られます。

Powered by
Movable Type