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

フィールドが追加される。