Как получить данные от многих ко многим отношениям с Lift - PullRequest
1 голос
/ 30 марта 2012

Допустим, у меня есть 3 таблицы: Книга, Автор и Автор книги.

Book has id, title
Author has id, name
BookAuthor has id, book_id, author_id

Я хочу найти всех авторов книги.Кто-нибудь может подсказать мне, как это сделать с помощью синтаксиса Lifts Mapper?

Ответы [ 2 ]

2 голосов
/ 11 июня 2012
class Book extends LongKeyedMapper[Book]
                               with IdPK
                               with ManyToMany { 
    def getSingleton = Book
    object title extends MappedString(this, 255)
    object authors extends MappedManyToMany( 
        BookAuthors, BookAuthors.book, BookAuthors.author, Author) 
}

object Book extends Book with LongKeyedMetaMapper[Book]

class Author extends LongKeyedMapper[Author]
                                 with CreatedUpdated with IdPK
                                 with ManyToMany { 
    def getSingleton = Author
    object firstName extends MappedString(this, 255)
    object lastName extends MappedText(this)
    object email extends MappedEmail(this, 150)
    object books extends MappedManyToMany( BookAuthors, 
             BookAuthors.author,     BookAuthors.book, Book)

}

object Author extends Author with LongKeyedMetaMapper[Author]

val warandpeace = Book.create.title("War and Peace").saveMe
val fred =  Author.create.firstName("Fred").saveMe
fred.books += warandpeace
fred.saveMe
val bob =  Author.create.firstName("Bob").saveMe
bob.books += warandpeace
bob.saveMe

// then to find all the authors of the book:
val authors = warandpeace.authors
0 голосов
/ 30 марта 2012

Вот картограф для книги:

class Book extends LongKeyedMapper[Book] with IdPk with OneToMany[Long, Book] {
  def getSingleton = Book
  object title extends MappedString(this, 200)
  object BookAuthor extends MappedOneToMany(BookAuthor, BookAuthor.id)
}
object Book extends Book with LongKeyedMetaMapper[Book]

Черта IdPk будет заботиться об идентификаторе Книги. Тогда для BookAuthor:

class BookAuthor extends LongKeyedMapper[BookAuthor] with IdPk with OneToOne[Long, BookAuthor] {
  def getSingleton = BookAuthor
  object Author extends MappedOneToOne(Author, Author.id)
}
object BookAuthor extends BookAuthor with LongKeyedMetaMapper[BookAuthor]

Тогда для автора, простой картограф:

class Author extends LongKeyedMapper[Author] with IdPk {
  def getSingleton = Author
  object name extends MappedString(this, 200)
}
object Author extends Author with LongKeyedMetaMapper[Author]

Тогда звоните, чтобы найти всех авторов книги (здесь myBook):

myBook.BookAuthor.map(x => x.Author.name)

Если вы хотите делать более сложные запросы на присоединение без необходимости фильтровать все в Scala, вы всегда можете использовать DB , и вы всегда можете найти дополнительную информацию о mapper здесь .

...