2012-10-24 24 views
3

我正在使用play 2.0框架編寫網站。解析結果時我遇到問題。 這個對MySQL數據庫的請求獲取了每集中添加到數據庫的所有鏈接(可以是每集數個節目)以及關於情節和動畫的所有信息。Play 2.0複雜連接查詢如何解析(Anorm)

def lastReleasedLink(limit:Long=5):List[(((Episode,Anime),Link),Genre)] = { 
    DB.withConnection { implicit c => 
     SQL(
     """ 
      select * from yas_episodes as a 
      inner join anime as b on a.ep_anime_id=b.id 
      left outer join yas_links as c on a.ep_id=c.ep_id 
      LEFT JOIN yas_animes_genres AS d ON a.ep_anime_id = d.ag_anime_id 
      INNER JOIN yas_genres AS e ON e.g_id = d.ag_genre_id 
      where c.ep_id IS NOT NULL group by c.ep_id order by c.date desc limit {limit} 
     """).on('limit ->limit)as(Episode.simple~Anime.simple~Link.simple~Genre.simple map{ 
     case episode~anime~link~genre => episode -> anime -> link -> Genre 
     } *) 
    } 
    } 

的返回值是 類型,但我怎麼能形成輸出的 列表讓說List[episode,anime,Seq[links]]List[episode,anime,Seq[Genres],Seq[links]]不知道往哪裏放流派。

你可以想象,當你有兩個鏈接每一個表情節信息從表動畫和yas_episodes將被複制每一行。所以我需要以某種方式將它們按照節目記錄疊加在一起(組)。然後可以迭代列表並訪問所有對象。

正如您所看到的,請求中存在動漫與流派之間的多對多關係。 我不知道如何將所有列在一起,以便能夠在視圖中訪問它。體裁應該是動漫模型的一部分嗎?

回答

2

看來,實現這一目標的首選方式是使用Scala收集API,見Guillaume Bort的this post

在你的情況,我想你可以通過(集,動畫)做這樣的事情

lastReleasedLink groupBy { case (((e, a), l), g) => (e, a) } 

到組。一般來說,如果你改變你的函數返回一個List[(Episode, Anime, Link, Genre)]這些操作都可能輕鬆一點,即

case episode~anime~link~genre => (episode, anime, link, genre) 

,那麼你可以用這個代碼實現相同的:

lastReleasedLink groupBy ((_._1, _._2)) 
+0

哦,感謝那絕對會解決這個問題。我仍然需要習慣Scala =) – Yaroslav