2013-09-09 2 views
0

У меня проблема с определением отношений для моего первого проекта CakePHP. Я пытаюсь создать систему управления списком пакетов Backpacking Gear. Вот мои таблицы:CakePHP: Вопросы взаимоотношений

Gear - Каждый предмет экипировки находится в одной категории, но может быть во многих списках передач, но является специфичным для пользователя.

Категории - Категория вышеуказанных предметов экипировки. Категории уникальны.

Список передач - Каждый список передач может быть присвоен множеству различных поездок и является специфичным для пользователя. Когда элемент добавляется в этот список, его нельзя добавить снова.

Поездки - Каждая поездка имеет единственный список передач. Каждая поездка уникальна.

Пользователи - У каждого пользователя есть свои предметы, категории, списки передач и поездки.

Моя проблема, какая модель должна иметь место для списков передач и какие отношения следует использовать? Должна ли быть таблица для элементов списка передач, в которой хранятся данные из обеих таблиц? Как мне добавить несколько элементов в один список передач в базе данных? Мне нужно сохранить несколько item_id в одной строке?

Ближайший пример, который я могу представить, это корзина для покупок. У вас есть предметы для продажи, и у вас есть тележка (список передач). Вы добавляете предметы в корзину, а затем покупаете тележку (назначаете ее на поездку).

ответ

0

Хранение нескольких внешних ключей для одной и той же таблицы на одной записи обычно является неправильным способом.

Для меня это звучит, как вы ищете многие-ко-многим, т.е. hasAndBelongsToMany ассоциации, где GearList HABTM GearItem и наоборот (в случае, если вы хотите GearItem::find() вернуть связанные GearList записи).

Ассоциация хранится в отдельной таблице присоединиться, что способ, которым GearItem может быть назначена много различных GearList, в то время как GearList может иметь много различных GearItem.

См. Также Saving Related Model Data (HABTM).

+0

Вы объявляете эти отношения в обеих моделях? Я нашел информацию о том, как построить таблицу соединений, поэтому, когда я добавлю новый GearItem в GearList, напишу ли я его в таблице gearitems_gearlists (join table)? Наконец, кажется, что мне нужен внешний ключ GearItem в таблице GearList и наоборот. Как это будет возможно, если он может иметь несколько списков передач? –

+0

Если вы хотите, чтобы 'GearItem :: find()' включал связанные '' GearList', тогда да, определите его для обеих моделей. Запись в таблицу соединений выполняется CakePHP автоматически, см. [Сохранение связанных данных модели (HABTM)] (http://book.cakephp.org/2.0/ru/models/saving-your-data.html#saving-habtm) , – ndm

+0

@BobHaskett Нет, вам не нужны внешние ключи в таблицах для 'GearItem' и' GearList', все это происходит в таблице соединений, где каждая запись будет представлять собой ассоциацию между 'GearItem' и' GearList'. – ndm