symfony schema.yml の覚書
頭に搭載されている記憶装置が調子悪いので、忘れてもいいように……
symfony1.4とDoctrineで使うDBスキーマの定義。
定義内容
テーブル定義
テーブルクラスに設定できる項目
- abstract
- 生成クラスをabstractするかどうか。デフォルトはfalse。クラスはabstractのときはデータベースにエクスポートされない。
- className
- 生成するクラスの名前
- tableName
- 使用するDBMSのテーブルの名前
- connection
- モデルにバインドするDoctrine_Connectionインスタンスの名前
- columns
- カラムの定義
- relations
- リレーションの定義
- indexes
- インデックスの定義
- attributes
- 属性の定義
- actAs
- ActAsの定義
- options
- オプションの定義
- inheritance
- 継承の定義用の配列
- listeners
- アタッチするリスナーを定義する配列
- checks
- DBMSにエクスポートするのと同様にアプリケーションレベルで実行するチェック
カラムの定義
各テーブルクラスに設定したカラム内に設定できる項目
- name
- カラムの名前
- fixed
- カラムが修正されるかどうか
- primary
- カラムが主キーの一部であるかどうか
- autoincrement
- autoincrementカラムであるかどうか
- type
- Doctrineのカラムのデータ型
- length
- カラムの長さ
- default
- カラムのデフォルト値
- scale
- カラムのスケール。decimal型に使用される
- values
- enum型用の値のリスト
- comment
- カラム用のコメント
- sequence
- カラム用のシーケンスの定義
- zerofill
- カラムの空の文字列をゼロで満たすかどうか
- extra
- カラム定義に保存する追加情報の配列
- unsigned
- 符号なし数値
リレーション定義
relations内に設定したクラスに設定できる項目。
relations定義内に、各リレーション(外部キー設定)毎にリレーション先クラスを定義する。
- class
- リレーション用に使うクラスの名前。
- alias
- リレーションを識別するために使うエイリアス。
- type
- リレーションの型。値はoneもしくはmanyのどちらかでデフォルトはone。
設定側から見て相手レコードが複数存在する場合にmany。 - refClass
- 多対多のリレーション用に使われる中間の参照クラス。
- local
- リレーションで使われるローカルフィールドの名前。
- foreign
- リレーションで使われる外部フィールドの名前。
- foreignAlias
- リレーションの反対端のエイリアス。autoCompleteがtrueに設定されるときのみ許可されます。
- foreignType
- リレーションの反対端の型。autoCompleteがtrueに設定されるときのみ許可されます。
- autoComplete
- リレーションを反対側に追加して双方向にするかどうか。デフォルトはtrue。
- cascade
- アプリケーションレベルのカスケーディングオプション。
- onDelete
- データベースレベルのカスケーディング削除の値。
- onUpdate
- データベースレベルのカスケーディング更新の値。
- equal
- リレーションが入れ子の多対多に等しいかどうか。
- owningSide
- -
- refClassRelationAlias
- -
継承定義
- type
- 使用する継承の型。許可される値はconcrete、column_aggregation、とsimple
- extends
- 継承するクラスの名前
- keyField
- column_aggregation継承用のキーとして使用するフィールドの名前。
- keyValue
- column_aggregation継承でkeyFieldを満たす値
インデックス
- name
- 作成するインデックスの名前
- fields
- インデックスの中で使うフィールドの配列
- unique
- インデックスがユニークかどうか
グループに所属しているユーザを表す場合のスキーマサンプル
userテーブルとgroupテーブルを用意し、ORマッパーではそれぞれUserクラスとGroupクラスで取り扱えるようにする。
必ず主キーを設定しレコード作成日・更新日を記録する。各テーブルの個別定義は以下とする。
- ユーザテーブル
- 所属グループIDと名前を保持する
- 名前フィールドにインデックスを設定
- 物理削除ではなく論理削除とする
- グループテーブル
- グループ名を保持する
接続用のconfig/database.yml
all: user_admin: class: sfDoctrineDatabase param: dsn: mysql:host=localhost;dbname=user_admin username: mysqluserid password: mysqluserpass
スキーマYAML config/doctrine/schema.yml
User: connection: user_admin tableName: user columns: id: type: integer(4) fixed: false unsigned: true primary: true autoincrement: true group_id: type: integer(4) fixed: false unsigned: true primary: false notnull: true autoincrement: false comment: '所属グループID' name: type: string(255) notnull: true comment: 'ユーザ名' relations: Group: local: group_id foreign: id type: one actAs: Timestampable: SoftDelete: options: comment: 'ユーザ情報' Group: connection: user_admin tableName: group columns: id: type: integer(4) fixed: false unsigned: true primary: true autoincrement: true name: type: string(255) notnull: true comment: 'グループ名' actAs: [Timestampable] options: comment: 'グループ情報'
actAsにTimestampableを設定すると、新規登録・更新実行時に時間が記録され
created_at: type: datetime notnull: true updated_at: type: datetime notnull: true
フィールドが自動で追加される。
actAsにSoftDeleteを設定すると論理削除扱いとなり、自動的に
deleted: type: boolean notnull: true default: false
フィールドが追加される。