LoginSignup
1
1

More than 5 years have passed since last update.

[Grails]GORMの簡単な使い方

Posted at

注意:メモ段階

色々なパターンが想定されるので、基本的なパターンを都度追記していく予定。

前提条件

  • デフォルトだとGrailsが生成するでversionカラムは利用しない。
  • テーブルはdbCreateモードでGrailsが自動生成する物を利用する(しない場合は都度説明する)

多対1

例えば、会社テーブルと社員テーブルがあって、一つの会社には複数の社員が働いている場合。
ソースは以下の2つ。

Company.groovy
class Company {
    // 会社テーブルに該当するCompanyドメイン
    String name
    static constraints = {
    }
    static mapping = {
        version false
    }
}
Employee.groovy
class Employee {
    // 社員テーブルに該当するEmployeeドメイン
    String name
    Company company
    static constraints = {
    }
    static mapping = {
        version false
    }
}

EmployeeドメインがCompanyドメインをプロパティに持っている。

よっしゃ早速試してみようぜ!の前に、Grailsを起動する時にテストデータを登録したいから、Bootstrap.grooyを以下の様に編集する。

Bootstrap.groovy
class BootStrap {

    def init = { servletContext ->
        Environment.executeForCurrentEnvironment {
            development {
                def cmp1 = new Company(name:"BIG-Company").save(flush:true)
                def cmp2 = new Company(name:"SMALL-Company").save(flush:true)

                new Employee(name:"Mr.A", company: cmp1).save(flush:true)
                new Employee(name:"Mr.B", company: cmp1).save(flush:true)
                new Employee(name:"Mr.C", company: cmp1).save(flush:true)
                new Employee(name:"Taro", company: cmp2).save(flush:true)
            }
            test {
                println "test!"
            }
            production{
                println "production!"
            }
        }
    }
    def destroy = {
    }
}

コレで準備完了!
Grailsを起動すると、以下のテーブルが生成される。

スクリーンショット 2014-02-02 2.43.16.png

Employeeテーブル(Employeeドメイン)にCompanyテーブルのIDが持たれている。
いい感じに普通のテーブル構成。
じゃあ実際どうやってGrailsで値を取得すれば良いの?というサンプルは以下。

OneToMany
package bindingtest

class ManyToOneSampleController {

    def index() {

        // ドメインクラスにfindByNameなんてメソッドは定義してないぞ!?
        // これがGORMの必殺技、ダイナミックファインダー!!
        Company company = Company.findByName("BIG-Company")

        // Employeeでも必殺ダイナミックファインダー!
        // ちなみに複数のレコードを返す可能性がある場合は、findAllを使う。
        // 全部のレコード取得するぜ、ちなみにCompanyプロパティにcompanyを持っている人ね。
        List employees = Employee.findAllByCompany(company)

        def text = employees.collect{it.name}.join(" & ")

        // 取得されるレコードは当然BIG-Companyに所属する3人
        // Taro さんはSMALL-Company所属なので取得されない
        assert 3 == employees.size()
        assert 'Mr.A & Mr.B & Mr.C' == text

        // さて、取得された社員達ですが、彼らはプロパティにCompanyを持っています。
        // と言う事は、ドメインのプロパティを使って別のドメインにアクセス出来るのです!
        // ちなみにhead()は、リストの先頭要素を返すメソッド。
        assert "BIG-Company" == employees.head().company.name

        render text
    }
}

テストなのでとりあえずコントローラにべた書き。
assertを入れてるからその通りだけど、このコントローラにアクセスすると、 Mr.A & Mr.B & Mr.C と表示される。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1