Как внедрить систему оборудования в CakePHP
-
05-07-2019 - |
Вопрос
Я пытаюсь создать веб-игру на основе CakePHP в основном для практики, а также для удовольствия, но сталкиваюсь с головоломкой, пытаясь определить систему оборудования.
У меня есть таблица Items, которая содержит всю возможную информацию об элементе, включая поле item_type, которое содержит целочисленное значение, определяющее тип элемента и, в результате, какую информацию об элементе использовать.
т. е.item_type = '1' означает, что предмет является шляпой для использования, а это значит, что необходимой информацией являются только мощность, цена, бонусы и требования.Все это работает нормально.
У меня также есть таблица items_users HABTM, настроенная для хранения всех принадлежащих в данный момент предметов, которые есть у каждого игрока, это также работает нормально.
Что я пытаюсь выяснить, так это то, как будет работать система оборудования.Сначала я подумал о столе для оснащения, таком как:
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
Единственная проблема при использовании подобной системы заключается в том, что CakePHP не поддерживает несколько внешних ключей для модели.
Есть ли у кого-нибудь какие-либо идеи относительно того, как внедрить такую систему?
Редактировать Существующая таблица HABTM items_users используется для хранения того, какими элементами в данный момент владеет пользователь.Каждый раз, когда пользователь приобретает новый элемент, его идентификатор и идентификатор пользователя сохраняются в таблице items_users.Я просто пытаюсь понять, как внедрить систему оборудования.
Говоря "не поддерживает несколько внешних ключей", я имею в виду, что CakePHP изначально не поддерживает несколько внешних ключей из одной таблицы в другой таблице.В моем примере таблица equips содержит 8 внешних ключей, все указывающие на item_id .
Решение
Я обнаружил, что отношения HABTM лучше всего подходят для простых отношений, а не для сложных, как вы описали выше.Идея отношения HABTM состоит в том, чтобы сделать таблицу соединений почти невидимой, чтобы вам не нужно было поддерживать дополнительные внешние ключи.Это хорошо работает для простых случаев.
В вашем случае у вас есть таблица equips, которая будет объединена со всеми другими аспектами вашей системы.В дизайне вам нужна отправная точка.Я бы предположил, что "пользователь" был бы этой отправной точкой, и у пользователя было бы много оборудования.Вы можете ограничить пользователя наличием только одного equip, что практически позволяет объединить таблицы user и equips в одну.
В любом случае вам нужно начать с определения правил.
Пользователь -> Имеет одного -> Оснащает Оснащает -> Принадлежит -> Пользователю
Согласно вашей базе данных deisgn, похоже, что будут установлены следующие взаимосвязи.Экипировка -> Принадлежит -> шляпа Экипировка -> Принадлежит -> Брюки Экипировка -> Принадлежит -> Wep Wep -> У многих -> Экипировка ...
Чтобы создать лучшее приложение, я бы предложил построить все возможные взаимосвязи и просмотреть результирующий набор данных из каждого представления...
$this->User->recursive = 2;
pr($this->User->find("first");
Оттуда я бы изменил дизайн таблиц, чтобы получить структуру, которая хорошо выглядит и имеет смысл.Затем обрежьте ненужные связи.
Также потратьте некоторое время на изучение моделей привязки и развязки.Это позволит вам более эффективно настраивать данные и взаимосвязи, как только структура базы данных станет стабильной.
Надеюсь, это немного поможет.