Craft CMSというかYii Framework 2.6に関するメモ。
models
DBに保存されないデータモデル。
主に入力の検証を行う(ログインフォーム等のデータモデル)。
必須(required)、型(AttributeType)、規定値(default)、サイズ(length)などの属性を定義。
records
DBに保存するデータモデルは、Active Record(AR)として定義する。
DB型(ColumnType)、重複不可(unique)、主キー、外部キー、などRDBに関する定義は一通りできる。
Number型のPKは自動的にAuto Incrementになる。
作成したプラグインをインストールすると、recordsの定義通り、DBにテーブルが自動作成される。
リレーションの書き方サンプル
[MyPlugin_TagGroupRecord.php](親テーブル)
protected function defineAttributes()
{
return array(
'group_id' => array(AttributeType::Number, 'column' => ColumnType::PK, 'required' => true),
'tag_id' => array(AttributeType::Number, 'required' => true),
'content_id' => array(AttributeType::Number, 'required' => true),
);
}
public function defineRelations() {
return array(
'taggroup' => array(self::HAS_MANY, 'MyPlugin_TagRecord', 'tag_id'),
);
}
[MyPlugin_TagRecord.php](子テーブル)
protected function defineAttributes()
{
return array(
'tag_id' => array(AttributeType::Number, 'column' => ColumnType::PK, 'required' => true),
'name' => AttributeType::String,
);
}
public function defineRelations() {
return array(
'taggroup' => array(static::BELONGS_TO, 'MyPlugin_TagGroupRecord', 'tag_id', 'required' => true, 'onDelete' => static::CASCADE),
);
}
Craft CMSのdefineRelations()は、リレーションで親テーブルの主キー以外のカラムを参照しようとしても、主キーとリレーションを作成してしまうようなので、主キー以外とのリレーション定義は下記のようにするしかないかも。
[MyPlugin_TagRecord.php](子テーブル)
public function createTable() {
parent::createTable();
craft()->db->createCommand()->addForeignKey($this->getTableName(), 'tag_id', 'myplugin_taggroup', 'tag_id');
}
※入力>確認画面>保存のようなUIフローを持つ場合は、models/recordsを両方定義してもいい。


コメント