1

我無法弄清楚如何構造這個。這是我的應用程序:這個CakePHP應用程序的模型關係應該如何?

這是一個遊戲網站...說遊戲是「單詞搜索」,「sodoku」和「縱橫字謎」。

每場比賽都有許多難題。所以有100左右不同的單詞搜索玩,100左右不同的sodokus等。

每個遊戲也有很多模式。所以有5個左右的方法來做每個詞搜索(定時,不定時等),5種方式來玩數獨,等等。

每個遊戲模式拼圖組合有很多高分。因此,如果您播放定時搜索字3,則會出現某個高分表。如果你玩同一個謎題沒有計時,就會出現一個不同的高分表,如果你玩#4計時,第三個高分表出現等等。

最後每個高分都有一個用戶。

我最初的做法是每個遊戲都有很多難題和模式,每個難題都有很多高分,每個高分都有一個用戶。正如你可能看到的那樣,這沒什麼意義,因爲高分是爲什麼屬於謎題,而不是模式?當我顯示高分時,我會顯示遊戲 - >拼圖 - >高分,並添加高分模式=當前模式的條件。沒有理由我需要有條件,因爲關係很清楚。

原來這就是我:

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

我意識到,一個更好的方法來組織,這將是與困惑和模式的HABTM關係。所以每個遊戲都有很多mode_puzzles,每個mode_puzzle有一個模式,一個難題和許多高分。

因此它可以被修改爲這樣:

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

這樣做的問題是,現在當我想一個新的模式,增加了遊戲,或添加新的益智的遊戲,我要處理我必須手動創建的這個繁瑣的新表,儘管它應該有可能在不創建整個新表的情況下具有此關係。對於每個遊戲,任何模式都可以與任何謎題,所以爲什麼我需要手動創建這個表?

人們建議使用烘焙,但從我見過的烘烤自動生成模型,但我需要自己生成表格本身。

我有一種感覺,該解決方案具有連接或東西,但我沒有經歷過的MySQL連接或CakePHP的是如何處理他們之類的東西做的。也有人建議說,每個謎題有很多模式,每種模式都有很多高分,但我不想這樣做,因爲每個有許多模式的謎題或每種模式都有許多謎題之間沒有區別......並且我正在緩存整個結構,所以如果我不得不爲每個謎題重複每種模式,或者反之,陣列變得巨大。有沒有人有解決這個問題?

回答

1

您可能想要更好地熟悉CakePHP提供的模型associations。這裏是解決方案,我會建議:

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 
+0

謝謝sooo很多的迴應!我想我對「模式」不是很清楚,我爲此道歉。模式是針對每個遊戲的,因此正確的關係是模式模型位於遊戲模型中的hasMany數組中。我想我對「連接」有所瞭解http://bakery.cakephp.org/articles/nate/2009/01/21/quick-tip-doing-ad-hoc-joins-in-model-find但我'我們仍然需要做更多的研究和研究,因爲它位於一個巨大的線程陣列中間,所以它不能完全匹配鏈接上的內容。 – 2013-05-02 01:22:34

+0

不客氣!我不認爲你需要做任何加入,試着遵守這些慣例。您可以通過將模式置於遊戲和益智之間或者簡單地使用此解決方案,如您所說,通過使模式屬於遊戲並保持原樣,包括遊戲/謎題關係。 – 2013-05-02 14:10:45

+0

嘆息......我很確定我必須使用連接。我需要一個包含Modes表和Puzzles表的信息(稱爲「PuzzleMode」)的模型,以便我可以獲得Game-> PuzzleMode-> Highscore的關係。我試圖找到一種方法來生成這個,而不必手動創建一個表,但我找不到答案。這基本上是一個完整的加入,因爲對於每個遊戲,你可以有任何組合的模式或謎題,這應該導致一個獨特的高分表。問題是,我怎樣才能將這個模型告訴模型而不需要創建一個不需要的新表? – 2013-05-02 14:58:21

相關問題