迭代时在 Grails 中访问另一个数据库 table
Access another database table in Grails while iterating
我有这些模型
Game.groovy
class Game {
String gameTitle
static hasMany = [screenshot: Screenshots list:GameList]
}
GameList.groovy
class GameList {
static belongsTo = [game : Game , category : GameCategory]
static constraints = {
}
}
GameCategory.groovy
class GameCategory {
String categoryName
String icon
String toString(){
"${categoryName}"
}
static hasMany = [ list:GameList]
static constraints = {
}
}
在我的控制器中
GameController.groovy
def listGame(){
def category = GameCategory.list()
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def game = GameList.findAllByCategory(myCategory).collect{it.game}
[currentCategory:currentCategory, category:category, game:game]
}
在我看来,我迭代了所有游戏以显示特定类别中的每个游戏。
此外,我想显示每个游戏的所有类别。如何在每次迭代中访问每个游戏的类别?
如果您想要 每个 Game
以及所有与该游戏相关的 GameCategory
的列表:
def gamesAndCategories = Game.list().collect{ Game g ->
def matchingCategories = GameList.findAllByGame(g)*.category
return [game: g, categories: matchingCategories]
}
如果您想为 Game
的特定子集关联 GameCategory
,则可以将 Game.list()
替换为 Game
的集合。
然后您可以将 gamesAndCategories
添加到您现有的返回地图并在您的视图中使用它。
使用域模型,您无法从 Game
实例访问游戏类别,因为无法导航从 Game
到 GameCategory
的关联。保持相同的域模型,这是一个技巧:
def listGame(){
def category = GameCategory.list()
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def game = GameList.findAllByCategory(myCategory).collect{it.game}
def gameCategories = GameList.withCriteria {
inList 'game', game
projections {
property 'game'
property 'category'
}
}.groupBy { it[0] }
.collectEntries { game, record -> [(game): record*.getAt(1)] }
[currentCategory:currentCategory, category:category, game:game, gameCategories: gameCategories]
}
gameCategories
是一个 Map<Game, List<GameCategory>>
,粗略地说,它包含 game
变量中每个 Game
的所有 GameCategory
。您可以将它传递给您的视图并使用它来查找 Game
的 GameCategory
:def categories = gameCategories[gameInstance]
但是,您可以通过使用不同的域模型来简化所有这些操作,如下所示:
另一种域模型
class Game {
String gameTitle
static hasMany = [screenshot: Screenshots, categories: GameCategory]
}
class GameCategory {
String categoryName
String icon
String toString(){
"${categoryName}"
}
static hasMany = [games: Game]
static constraints = {
}
}
现在,Game
有很多GameCategory
,GameCategory
有很多 Game
秒。有了这样的模型,listGame()
可以简化为:
def listGame(){
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def games = myCategory.games
[currentCategory:currentCategory, games: games]
}
然后,在您的视图中,您可以像这样渲染游戏和类别:
<g:each var="game" in="${games}">
<!-- Render game -->
<g:each var="category" in="${game.categories}">
<!-- Render the game's category -->
</g:each>
</g:each>
我有这些模型
Game.groovy
class Game {
String gameTitle
static hasMany = [screenshot: Screenshots list:GameList]
}
GameList.groovy
class GameList {
static belongsTo = [game : Game , category : GameCategory]
static constraints = {
}
}
GameCategory.groovy
class GameCategory {
String categoryName
String icon
String toString(){
"${categoryName}"
}
static hasMany = [ list:GameList]
static constraints = {
}
}
在我的控制器中 GameController.groovy
def listGame(){
def category = GameCategory.list()
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def game = GameList.findAllByCategory(myCategory).collect{it.game}
[currentCategory:currentCategory, category:category, game:game]
}
在我看来,我迭代了所有游戏以显示特定类别中的每个游戏。 此外,我想显示每个游戏的所有类别。如何在每次迭代中访问每个游戏的类别?
如果您想要 每个 Game
以及所有与该游戏相关的 GameCategory
的列表:
def gamesAndCategories = Game.list().collect{ Game g ->
def matchingCategories = GameList.findAllByGame(g)*.category
return [game: g, categories: matchingCategories]
}
如果您想为 Game
的特定子集关联 GameCategory
,则可以将 Game.list()
替换为 Game
的集合。
然后您可以将 gamesAndCategories
添加到您现有的返回地图并在您的视图中使用它。
使用域模型,您无法从 Game
实例访问游戏类别,因为无法导航从 Game
到 GameCategory
的关联。保持相同的域模型,这是一个技巧:
def listGame(){
def category = GameCategory.list()
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def game = GameList.findAllByCategory(myCategory).collect{it.game}
def gameCategories = GameList.withCriteria {
inList 'game', game
projections {
property 'game'
property 'category'
}
}.groupBy { it[0] }
.collectEntries { game, record -> [(game): record*.getAt(1)] }
[currentCategory:currentCategory, category:category, game:game, gameCategories: gameCategories]
}
gameCategories
是一个 Map<Game, List<GameCategory>>
,粗略地说,它包含 game
变量中每个 Game
的所有 GameCategory
。您可以将它传递给您的视图并使用它来查找 Game
的 GameCategory
:def categories = gameCategories[gameInstance]
但是,您可以通过使用不同的域模型来简化所有这些操作,如下所示:
另一种域模型
class Game {
String gameTitle
static hasMany = [screenshot: Screenshots, categories: GameCategory]
}
class GameCategory {
String categoryName
String icon
String toString(){
"${categoryName}"
}
static hasMany = [games: Game]
static constraints = {
}
}
现在,Game
有很多GameCategory
,GameCategory
有很多 Game
秒。有了这样的模型,listGame()
可以简化为:
def listGame(){
def currentCategory = params.categoryName
def myCategory=GameCategory.findByCategoryName(currentCategory)
def games = myCategory.games
[currentCategory:currentCategory, games: games]
}
然后,在您的视图中,您可以像这样渲染游戏和类别:
<g:each var="game" in="${games}">
<!-- Render game -->
<g:each var="category" in="${game.categories}">
<!-- Render the game's category -->
</g:each>
</g:each>