Powered by SmartDoc

モデルファイルの例

モデルファイルの例として、会社(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属性を例に記述します。namenamecolumn_nameNAMEを設定します。これでデータベースにはNAMEの名前で問い合わせが行われるようになり、nameというキーでオブジェクトにアクセスできるようになります。

続いてデータ型のマッピングです。name属性は文字列ですから、external_typecharを、class_nameStringを設定します。データ型が文字列の場合、長さ(width)も設定できます。この項目を設定しておくと、データの追加・更新時に文字列の長さが範囲内かどうかチェックされます。

attributes:
      -
        name:          name
        column_name:   NAME
        external_type: char
        class_name:    String
        width:         64

同様にして他の属性も設定します。

リレーションシップ

「リレーションシップ名(name)、参照先のエンティティ名(destination)、リレーションシップカーディナリティ(to_many)、結合(jonis)」を設定します。

EmployeeエンティティからCompanyエンティティへのリレーションシップを記述してみましょう。まずはnamecompanyと設定します。これで、companyというキーでオブジェクトからリレーション先にアクセスできます。続けてdestinationCompanyを設定します。さらにこのリレーションシップは1対1ですから、to_manyfalseを設定します。

次に、どの属性を結合するかを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_manytrueに設定します。

完全なモデルファイル

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