Domanda

Sto tentando di creare un gioco web basato su CakePHP principalmente per esercitarsi e per divertirmi, ma sto incontrando un enigma cercando di capire un sistema di equipaggiamento.

Ho una tabella Articoli che contiene tutte le possibili informazioni su un articolo, incluso un campo item_type che contiene un valore intero che determina quale sia il tipo di articolo e, di conseguenza, quali informazioni sull'articolo usare.

vale a dire. item_type = '1' significa che l'oggetto è un cappello da usare, il che significa che solo potere, prezzo, bonus e requisiti sono informazioni necessarie. Funziona tutto bene.

Ho anche creato un tavolo HABTM items_users per memorizzare tutti gli oggetti attualmente posseduti da ciascun giocatore, anche questo funziona bene.

Quello che sto cercando di capire è come funzionerebbe un sistema di equipaggiamento. Ho pensato per la prima volta a una tabella di equipaggiamento come:

    CREATE TABLE `aevum_tf`.`equips` (
`id` INT NOT NULL ,
`user_id` INT NOT NULL ,
`hat_id` INT NOT NULL ,
`wep_id` INT NOT NULL ,
`offhand_id` INT NOT NULL ,
`pants_id` INT NOT NULL ,
`acca_id` INT NOT NULL ,
`accb_id` INT NOT NULL ,
`accc_id` INT NOT NULL ,
`shirt_id` INT NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE (
`user_id`
)
) ENGINE = InnoDB 

L'unico problema con l'utilizzo di un sistema come questo è che CakePHP non supporta più chiavi esterne per un modello.

Qualcuno ha qualche idea su come implementare un tale sistema?

EDIT La tabella HABTM esistente di items_users viene utilizzata per archiviare gli articoli attualmente di proprietà dell'utente. Ogni volta che un utente acquisisce un nuovo articolo, è id e l'id dell'utente viene archiviato nella tabella items_users. Sto solo cercando di capire come implementare un sistema di equipaggiamento.

Non supporta più chiavi esterne, intendo che CakePHP non supporta nativamente più chiavi esterne da una tabella in un'altra tabella. Il mio esempio equips table ha 8 chiavi esterne, tutte puntate su item_id's.

vedi: https://trac.cakephp.org/ticket/1923

È stato utile?

Soluzione

Ho scoperto che le relazioni HABTM sono le migliori per relazioni semplici, non complesse come quelle sopra descritte. L'idea di una relazione HABTM è di rendere quasi invisibile la tabella di join in modo da non dover conservare le chiavi esterne extra. Funziona bene per casi semplici.

Nel tuo caso, hai la tabella equips che si unirebbe a tutti gli altri aspetti del tuo sistema. Nella progettazione, è necessario un punto di partenza. Immagino l'utente " utente " sarebbe quel punto di partenza e l'utente avrebbe molte attrezzature. Puoi limitare un utente ad avere un solo equipaggiamento, il che si presterebbe quasi a fondere l'utente ed equipaggiare le tabelle in un singolo.

In ogni caso è necessario iniziare definendo le regole.

Utente - > HasOne - > FORNISCE Equipaggia - > Appartiene a - > Utente

Secondo la progettazione del database, sembra che sarebbero state stabilite le seguenti relazioni. Equipaggia - > Appartiene a - > Cappello Equipaggia - > Appartiene a - > Ansimare Equipaggia - > Appartiene a - > Wep Wep - > HasMany - > FORNISCE ...

Per creare la migliore applicazione, suggerirei di costruire ogni possibile relazione e guardare il set di dati risultante da ogni vista ...

$this->User->recursive = 2; 
pr($this->User->find("first");

Da lì ridisegnerei le tabelle per ottenere una struttura che abbia un bell'aspetto e abbia un senso. Quindi tagliare le relazioni non necessarie.

Passa anche un po 'di tempo a cercare modelli vincolanti e non vincolanti. Ciò consentirà di personalizzare in modo più efficace i dati e le relazioni una volta che la progettazione del database è stabile.

Spero che questo aiuti un po '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top