注意:メモ段階
色々なパターンが想定されるので、基本的なパターンを都度追記していく予定。
前提条件
- デフォルトだと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を起動すると、以下のテーブルが生成される。
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 と表示される。