迭代时在 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 实例访问游戏类别,因为无法导航从 GameGameCategory 的关联。保持相同的域模型,这是一个技巧:

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。您可以将它传递给您的视图并使用它来查找 GameGameCategorydef 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有很多GameCategoryGameCategory有很多 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>