モデルファイルの例として、会社(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