モデルファイルの例として、会社(Company
)と従業員(Employee
)のシンプルなモデルを考えます。
まず、データベース上のテーブルから見ていきましょう。COMPANY
テーブルはCOMPANY_ID
(会社ID)とNAME
(名前)のフィールドを持ち、主キーはCOMPANY_ID
とします。一方EMPLOYEE
テーブルは主キーのEMPLOYEE_ID
(従業員ID)とNAME
(名前)のフィールドに加えて、外部キーとしてCOMPANY_ID
(会社ID)を持ちます。
EMPLOYEE
テーブルから見てCOMPANY
テーブルとは1対1のリレーションシップとなり、COMPANY
テーブルからはEMPLOYEE
テーブルと1対多のリレーションシップとなります。データ型はどちらもNAME
属性が文字列型、主キーと外部キーは整数型とします。
次にモデルへのマッピングですが、基本的にテーブルをエンティティに、フィールドを属性にそのままマッピングします。原則として主キーと外部キーはクラス属性に含めないので、クラス属性は両エンティティのNAME
属性のみになります。
このとき、主キー名にid
と設定しないでください。主キーをid
とすると、オブジェクトにアクセスしてもObject#id
が呼び出されてしまいます。
次にここまでのマッピングを示します。+
の属性は主キー、-
の属性はクラス属性です。
最後にリレーションシップを設定します。リレーションシップは単方向なので、両エンティティにリレーションシップを設定する必要があります。どちらのリレーションシップもcompany_id
属性を結合します。
次が最終的なマッピングです。リレーションシップもクラス属性に含めます。
では、今マッピングしたモデルをファイルに記述しましょう。モデルファイルはYAMLで記述しますが、YAMLについてここでは詳しく説明しません。
マッピングの前に、データベースと接続するアダプタ名(adapter_name)
を設定します。現在使用できるのはDBIアダプタのみです。この項目は省略しても構いません。
もうひとつ、connection
にデータベースとの接続に必要な情報を設定します。設定する項目はURL(url
)、ユーザー名(user
)、パスワード(password
)です。いずれも環境に合わせて設定してください。
adapter_name: DBI connection: url: dbi:Mysql:examples user: mysql password: mysql
アダプタの設定を記述したら、順次にエンティティのマッピング(entities
)を行います。エンティティごとにエンティティ名(name
)とテーブル名(external_name
)を設定します。
また、そのほか「各属性(attributes
)、リレーションシップ(relationships
)、主キー(primary_key_attributes
)、クラス属性(class_properties
)」の項目を設定する必要があります。
属性とリレーションシップを記述したら、必要な要素を主キーとクラス属性の項目に記述します。Employee
エンティティでは、主キーはemployee_id
属性で、name
属性とcompany
リレーションシップがクラス属性です。外部キーのcompany_id
はクラス属性に設定しません。同様にCompany
エンティティの主キーとクラス属性も設定します。
entities: - name: Employee external_name: EMPLOYEE attributes: (以下に属性を記述) relationships: (以下にリレーションシップを記述) primary_key_attributes: - employee_id class_properties: - name - company
「属性名(name
)、フィールド名(column_name
)、データ型(external_type
)、マッピングするクラス(class_name
)」を設定します。
ここでは、Employee
エンティティのname
属性を例に記述します。name
にname
、column_name
にNAME
を設定します。これでデータベースにはNAME
の名前で問い合わせが行われるようになり、name
というキーでオブジェクトにアクセスできるようになります。
続いてデータ型のマッピングです。name
属性は文字列ですから、external_type
にchar
を、class_name
にString
を設定します。データ型が文字列の場合、長さ(width
)も設定できます。この項目を設定しておくと、データの追加・更新時に文字列の長さが範囲内かどうかチェックされます。
attributes: - name: name column_name: NAME external_type: char class_name: String width: 64
同様にして他の属性も設定します。
「リレーションシップ名(name
)、参照先のエンティティ名(destination
)、リレーションシップカーディナリティ(to_many
)、結合(jonis
)」を設定します。
Employee
エンティティからCompany
エンティティへのリレーションシップを記述してみましょう。まずはname
にcompany
と設定します。これで、company
というキーでオブジェクトからリレーション先にアクセスできます。続けてdestination
にCompany
を設定します。さらにこのリレーションシップは1対1ですから、to_many
にfalse
を設定します。
次に、どの属性を結合するかをjoinsに設定します。参照元(source
)にcompany_id
属性(Employee
エンティティ)を、参照先(destination
)にcompany_id
属性(Company
エンティティ)を設定します。
最後にこのリレーションシップをEmployee
エンティティの箇所に記述します。
relationships: - name: company destination: Company to_many: false joins: - source: company_id destination: company_id
同様にして、Company
エンティティのemployees
リレーションシップも記述します。ただしこちらは1対多のリレーションシップなので、to_many
をtrue
に設定します。
adapter_name: DBI connection: url: dbi:Mysql:examples user: mysql password: mysql entities: - name: Employee external_name: EMPLOYEE attributes: - name: employee_id column_name: EMPLOYEE_ID external_type: int class_name: Integer - name: name column_name: NAME external_type: char class_name: String width: 64 - name: company_id column_name: COMPANY_ID external_type: int class_name: Integer relationships: - name: company destination: Company to_many: false joins: - source: company_id destination: company_id primary_key_attributes: - employee_id class_properties: - name - company - name: Company external_name: COMPANY attributes: - name: company_id column_name: COMPANY_ID external_type: int class_name: Integer - name: name column_name: NAME external_type: char class_name: String width: 64 relationships: - name: employees destination: Employee to_many: true joins: - source: company_id destination: company_id primary_key_attributes: - company_id class_properties: - name - employees