それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

symfonyのリレーションシップ

ACCESSならルックアップテーブル指定すれば良いけれど。


PHPプログラムやJSP/Servlertプログラムで、同じ事をしたい。レコードの入力値をプルダウンで選びたい。たったそれだけのために。オレは時間を掛けてしまってた。なんて無駄をしてたんだ。

SELECTボックスの定義はドコに書く?


SELECT タグの自動生成が面倒。SELECTのOPTION項目が10を超えることは珍しいので、HTMLを手書きしている。手書きしちゃうと、OptionのVALUE管理が面倒だし。かといって、10レコード程度でテーブル定義するとアプリ作成が手間だし。INIファイルに書くと更新が手間だし。テンプレートに手書きするとソースからみれないし。


SELECT作成はDBにテーブル作成するのが一番だけど、手間だよなぁ。。。

それ、symfonyなら簡単だよ。


symfony generator なら簡単だった。schema.ymlにYAMLでリレーションシップ定義して、proprl-build-modelすればいい。

shcmema.ymlの書き方は、symfonyで簡単リレーションシップに書いた。

リレーションシップしたけれど。


Optionの名前はIDだった。


リレーションシップで作ったフィールドは自動的にSELECTで便利。でもID丸見えだぁ〜〜。数字じゃSELECTの意味無いんじゃん。

マニュアル読んで解決法を探ってきた


原因が、自動生成オブジェクトにtoString()メソッドがないから。だそうだ。

toStirng()メソッドを定義したら解決した。


これで、SELECT タグのOptionがわかりやすくなる。toString()でSELECT内容を制御するこの仕様が、個人的にお気に入りだ。

設定例

types テーブルからSELECTのオプションを選ぶときにtoString()を足してやる。

/**
 * Subclass for representing a row from the 'types' table.
 *
 * 
 *
 * @package lib.model
 */ 
class Types extends BaseTypes
{
	public function __toString(){
		return $this->getName()."のデータ";
		  //types テーブルにname フィールドがある。
                //$this->getNameは自動生成(たぶんリフレクション)されている
	}
}

SELECTボックス作るのは手間。propel-build-model と toString()でSELECTタグ自動生成は嬉しい。