2012-10-24 1 views
3

Я пишу веб-сайт с использованием рамки для воспроизведения 2.0. И у меня проблема при анализе результатов. Этот запрос к mysql db получает все ссылки (может быть несколько эпизодов), добавленных в базу данных за эпизод вместе со всей информацией об эпизоде ​​и аниме.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]] не знают, куда девать жанры.

Вы можете себе представить, что когда у вас есть две ссылки на один эпизод, информация из таблицы anime и yas_episodes будет скопирована для каждой строки. Поэтому мне нужно как-то складывать их вместе (группа) по записи эпизода. Тогда можно будет перечислить список и получить доступ ко всем объектам.

Как вы можете видеть, в запросе есть отношение «много ко многим» аниме с жанрами. Я не знаю, как я могу собрать все вместе в один список, чтобы иметь доступ к нему в поле зрения. Должен ли Жан быть частью модели Аниме?

ответ

2

Похоже, что предпочтительный способ достижения этого - использовать API коллекции Scala, см. 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

 Смежные вопросы

  • Нет связанных вопросов^_^