RSS

ArraySourceの勧め

22 3月

今日もお酒のまないんで、ひとつ記事かいてねることにします。本日もcakePHP2.1のお話です。
さて、設定ファイルでデータベースに持つ程でもない情報というのは、かつてconst.phpに書いてました。
ところが例えば男・女 とか、普遍的なものだったりあまり情報が書き換わらないものって結構あります。
で、設定ファイルが結構カオスになってたりします。

今回は、設定情報もこんなふうに持つと良いよってことで、https://github.com/cakephp/datasources/tree/2.0/Model/Datasource
ここからArraySource.phpだけをいただきます。そんでapp/Model/Datasourceにポロリと入れます。

次に、設定です。database.phpにこんな記述を足します。既存のデータベースの設定に追加してくださいね。

	var $ArraySource = array(
		'datasource' => 'ArraySource',
	);

これで、利用できる準備が整いました。
次にGender.phpっていうモデルをModel配下に作成します。

<?php
App::uses('AppModel', 'Model');
/**
 * Gender Model
 *
 */
 class Gender extends AppModel
{
    public $name = 'Gender';

    public $displayField = 'display';

    public $useDbConfig = 'ArraySource';//ここにdatabase.phpで宣言した変数名をセット

    public $records = array(
            array(
                'id' => 1,
                'display' => '男性',
            ),
            array(
                'id' => 2,
                'display' => '女性',
            ),
        );

    const MAN     = 1;//一応定数としても利用できるようにしてみた。
    const WOMAN = 2;

}

これで、このモデルをbelongToに持つモデルにこんなふうに設定すると、(注1)

	public $belongsTo = array(
		'Gender' => array(
			'className' => 'Gender',
			'foreignKey' => 'gender_id',
			'fields' => 'display',//これがちょっときになる指定
		)
	);

親のモデルから芋ずるに引っ張ってくるとあたかもGenderモデルがDBから取得したデータのように、「女性」や「男性」を返してくれます。
設定ファイルとかから参照しなくて良いので、かなりストレスフルフリーです。

echo h($value['Gender']['display']);

(注1)
ここで一点だけ。どうもcontainableを使う場合、$belongsToの条件に‘fields’ => ‘display’,
指定をするか、あるいはcontainableのconditionsの中に、フィールドを指定する、
のどちらかをしないと取ってこれませんでした。
親モデルからfind(‘all’)の場合は別に指定はいらないのですが、ビヘイビアを使う場合には
上記指定をしないと結果がarray()になってしまい、途中でフィールド名がunsetされてしまうようでした。
これ仕様なのかちょっとわからないです。
でもcontainable使ってるだけだからなあ。。。できればフィールド名は指定しなくてもいいようになるといいんですが。

ここからは確認していませんが、新規登録の時にもちゃんとlistでとってこれれば

 echo $this->Form->input('gender');

こんなかんじでアソシエーションの恩恵を受けられるのではないでしょうか。

というわけで、設定ファイルの値をあたかもDBから取得したように振る舞えるArraySource。ぜひみなさんも使ってみてください。

広告
 
2件のコメント

投稿者: : 3月 22, 2012 投稿先 cakephp, PHP

 

ArraySourceの勧め」への2件のフィードバック

  1. 清川康志

    1月 8, 2016 at 12:52 pm

    DB接続を減らして、性能を向上させる目的にも使えそうですね。すばらしいtipをありがとうございます。

     
    • yashio

      1月 9, 2016 at 9:42 am

      Commentありがとうございます。1つのModelとして扱えるので変換が要らないのが1つのメリットかなとおもってます!

       

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。