2010-03-13 32 views
15

Nếu tôi có một lớp Miền khách hàng và Khách hàng đó có nhiều khóa học. Làm cách nào để tìm khóa học tôi đang tìm? Ví dụ:Grails: Làm thế nào tôi có thể tìm kiếm thông qua các trẻ em trong mối quan hệ hasMany?

class Client { 
    String name 
    static hasMany = [courses:Course] 
} 

class Course { 
    String name 
    static belongsTo = [client:Client] 
} 

def client = Client.get(1) 

Tôi muốn "tìm" hoặc "tìm kiếm" trong mối quan hệ khóa học đó. Có thể một cái gì đó như:

client.courses.find(name:'Whatever') 

Có cách nào để làm điều này với Grails không?

Trả lời

27

Nếu bạn đang sử dụng bộ nhớ cache cấp thứ hai và đã định cấu hình cho liên kết này, bạn có thể muốn lặp lại bộ sưu tập (thao tác này sẽ giúp bạn truy vấn cơ sở dữ liệu nếu liên kết nằm trong bộ nhớ cache).

Dưới đây là một ví dụ bằng cách sử dụng thông minh Groovy Collection API:

def course = client.courses.find { it.name == "whatever" } 

Chú ý: Nếu bạn quyết định áp dụng cách này đảm bảo để configure eager/batch fetching của courses do đó bạn không chạy vào the n+1 problem.

+0

là phương pháp này tốt hơn phương pháp tiếp theo? –

+0

Nó phụ thuộc vào trường hợp sử dụng của bạn. Bạn thực sự nên tránh sử dụng các liên kết nếu nó có thể phát triển mà không có giới hạn, nhưng đối với các hiệp hội giới hạn trong một vài thực thể (<10?) Điều này có lẽ sẽ làm tốt cho rất nhiều trường hợp sử dụng. – Kimble

+0

Tôi khuyên bạn nên đóng gói mã tìm kiếm trong một phương thức dịch vụ hoặc trong chính lớp miền (như một phương thức getter) để bạn có thể dễ dàng thử các triển khai khác nhau trong một điểm chuẩn với dữ liệu trong thế giới thực. – Tobia

12

Một cách là với các phương pháp công cụ tìm động:

Courses.findAllByClientAndName(client, 'whatever') 

này sẽ được tất cả các khóa học của một khách hàng có tên là 'bất cứ điều gì'.

Grails cũng có few other ways để thực hiện việc này.

+0

Bạn sẽ làm gì nếu bạn không có thiết lập thuộc tính? – monksy

+1

Thay vào đó, bạn có thể truy vấn cột tham gia. Ví dụ 'findAllByClientIdAndName' nếu đối tượng' Course' có thuộc tính 'clientId'. Nó phụ thuộc vào cách miền của bạn thể hiện mối quan hệ giữa hai đối tượng. – ataylor

Các vấn đề liên quan