【问题标题】:What should my Model relationships be for this CakePHP app?对于这个 CakePHP 应用程序,我的模型关系应该是什么?
【发布时间】:2013-05-01 15:06:25
【问题描述】:

我无法弄清楚如何构建它。这是我的应用程序:

这是一个游戏网站...比如说游戏是“单词搜索”、“数独”和“填字游戏”。

每个游戏都有很多谜题。所以有大约 100 种不同的单词搜索可以玩,100 种左右不同的数独游戏等等。

每个游戏也有多种模式。因此,每个单词搜索有 5 种左右的方法(定时、不定时等),5 种玩数独的方法,等等。

每个游戏模式拼图组合都有很多高分。因此,如果您定时玩 wordsearch #3,则会出现某个高分表。如果您玩相同的拼图不计时,则会出现不同的高分表,如果您玩#4 计时,则会出现第三个高分表,依此类推。

最后,每个高分都有一个用户。

我最初的制作方式是每个游戏都有很多谜题和模式,每个谜题都有很多高分,每个高分都有一个用户。正如您可能看到的那样,这没有多大意义,因为为什么高分属于拼图,而不是模式?当我显示高分时,我会显示游戏->拼图->高分,并添加高分模式=当前模式的条件。我没有理由需要有条件,因为关系很清楚。

所以这就是我所拥有的:

Game->Puzzle->Highscore->User
    ->Mode

我意识到更好的构建方式是与谜题和模式建立 HABTM 关系。所以每个游戏都有很多mode_puzzle,每个mode_puzzle都有一个mode、一个puzzle和很多高分。

所以可以修改成这样:

Game (has many)->ModePuzzle (has many)->HighScore (has one)->User
                            (has one) -> Mode
                            (has one) -> Puzzle

这样的问题是,现在当我想为游戏添加新模式,或者为游戏添加新谜题时,我必须处理这个我必须手动创建的繁琐新表,即使它 应该可以在不创建整个新表的情况下建立这种关系。对于每个游戏,任何模式都可以有任何谜题,那为什么我必须手动创建这个表呢?

人们建议使用 bake,但据我所知, bake 会自动生成模型,但我需要自动生成表本身。

我感觉解决方案与连接或其他东西有关,但我对 MySQL 连接或 cakephp 如何处理它们或类似的东西没有经验。人们还建议说每个拼图有很多模式,每个模式都有很多高分,但我不想这样做,因为每个拼图有很多模式或每个模式有很多拼图之间没有区别......而且我正在缓存整个结构,所以如果我必须为每个谜题重复每种模式,反之亦然,数组会变得很大。有没有人可以解决这个问题?

【问题讨论】:

    标签: mysql cakephp has-and-belongs-to-many table-relationships


    【解决方案1】:

    您可能希望更好地熟悉associations CakePHP 提供的模型。这是我建议的解决方案:

    class Game extends AppModel {
        public $hasMany = array('Puzzle');
        ...
    }
    
    class Mode extends AppModel {
        public $hasMany = array('Puzzle');
        ...
    }
    
    class Puzzle extends AppModel {
        public $belongsTo = array('Game', 'Mode');
        public $hasMany = array('HighScore');
        ...
    }
    
    class User extends AppModel {
        public $hasMany = array('HighScore');
        ...
    }
    
    class HighScore extends AppModel {
        public $belongsTo = array('Puzzle', 'User');
        ...
    }
    

    puzzles 表应该有两个外键,game_idmode_id。与high_scores 表相同,其外键应为puzzle_iduser_id。我认为与模式和游戏相关的谜题组织很明显,因为它们基本上都是类别。高分表本质上是一个谜题和用户(许多用户玩许多游戏)之间的“拥有并属于许多”关系,其中包含一些额外的信息,即他们的分数。

    如果您像我在阅读问题的前几行时那样勾画关系,那么这个解决方案似乎很明显。

     Game  Mode
        \  /
         \/
       Puzzle  User
            \  / 
             \/
          HighScore
    

    【讨论】:

    • 非常感谢您的回复!我想我对“模式”不是很清楚,对此我深表歉意。模式特定于每个游戏,因此正确的关系是 Modes 模型位于游戏模型的 hasMany 数组中。我想我正在使用“joins”bakery.cakephp.org/articles/nate/2009/01/21/…,但我仍然需要做更多的研究和学习,因为它位于一个巨大的线程数组的中间,所以它与链接上的内容不完全匹配.
    • 不客气!我认为您不需要进行任何联接,请尝试遵守约定。您可以通过将 Mode 置于 Game 和 Puzzle 之间来调整此解决方案,或者就像您所说的,让 Mode 属于 Game 并保持其余部分不变,包括 Game/Puzzle 关系。
    • 叹息...我很确定我必须使用连接。我需要一个包含 Modes 表和 Puzzles 表中的信息的模型,称为“PuzzleMode”,这样我就可以拥有 Game->PuzzleMode->Highscore 的关系。我正在尝试找到一种无需手动为其创建表的方法来生成此表,但我没有找到答案。它基本上是一个完整的连接,因为对于每个游戏,您都可以有任何模式或拼图组合,这应该会导致一个独特的高分表。问题是,如何在不创建整个不必要的新表的情况下将其告诉模型?
    • 如果您尝试从游戏控制器获取最高分,您的查找查询应该类似于$this->Game->Puzzle->HighScore->find(...)$this->Game->Mode->Puzzle->HighScore->find(...)。是什么让您认为您需要 PuzzleMode 模型?
    • 感谢您的回复...说Game->Mode->Puzzle是不正确的,因为Puzzle和Mode都直接属于游戏。拼图不属于模式,反之亦然。尽管它可能会在我的问题的真空中起作用,但这种关系会导致未来出现问题。如果我从一开始就以正确的方式去做,那么一切都不会出错,但我现在看到这并不容易。我只是想到了一种可能的解决方案,即在单独的查询中以会话变量作为条件来获取高分……这不是我理想的解决方案,但我能想出的最好的解决方案。
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多