CakePHP HTBTM с дополнительным полем: Double Logical Relationship: Как построить $ this-> data в контроллере самостоятельно - PullRequest
1 голос
/ 26 августа 2010

У меня есть отношение HABTM между моделями "Event" и "Category". Но в таблице мостов, таблице "category_events", есть дополнительное поле с именем "is_primary"; Значение и Событие принадлежат 1 первичной категории и множеству вторичных категорий.

Я развернул 1 блок выбора с именем «primary_event» и флажки с именем «secondday_event []».

Когда я отправляю форму, данные появляются следующим образом. $ this-> data ['Event'] ['primary_event'] -> 4; $ this-> data ['Event'] ['primary_event'] -> array (1,3,5);

После этого, как мне передать эти данные в формат, который распознает Cake, и какую функцию сохранения модели я вызываю? Обращаем ваше внимание, что поле is_primary должно быть установлено в 1 для строки primary_event.

Спасибо, Моу

Ответы [ 3 ]

1 голос
/ 26 августа 2010

Как только в моей таблице присоединения есть что-то большее, чем двойные ключи (вероятно, event_id и category_id в вашем случае, я создаю ее как "автономную" модель и изменяю отношения следующим образом (снова, используя ваш пример):

Event -- hasMany --> EventCategory <-- hasMany -- Category
Event <-- belongsTo -- EventCategory -- belongsTo --> Category

Немного меньше "магии", но я думаю, что магия начинает разрушаться, как только вы вводите дополнительное свойство (например, поле). Это также дает вам немного больше гибкости длябудущее. Если вы уже нашли причину для введения одного нового свойства, то, скорее всего, вы найдете причину для добавления еще.

0 голосов
/ 26 августа 2010

is_primary является функцией событий, а не таблицы HABTM, с которой вы пытаетесь связать ее.HABTM связывает события и категории, а не события с событиями.is_primary должен храниться в таблице событий.Затем вам нужно связать вложенные события с их основным событием.Вот как это сделать.

1- Добавьте поле is_primary к таблице events и сделайте его логическим.

2 - Добавьте primary_event_id к таблице events.(Это будет содержать значение, только если событие является под-событием.)

3- Создайте связь между events и самим собой в модели событий.(http://book.cakephp.org/view/851/Multiple-relations-to-the-same-model) Это позволит использовать собственные ссылки, чтобы вы могли ссылаться на под-события на их основное событие.

Как только вы получите идентификатор интересующего вас события, вы можете выполнить запросы, чтобы найтииз под-событий:

$this->Event->find('all', array('conditions' => array('primary_event_id' => $id)));

Это вернет список всех под-событий.

0 голосов
/ 26 августа 2010

Как я понимаю ваше требование, вам нужно создавать и сохранять записи для модели categories_events (вам не нужно явно кодировать модель, если она не имеет особого поведения - CakePHP достаточно мудр, чтобы понять, что вы вы делаете и используете структуру модели по умолчанию).

Первыми будут созданы и сохранены первичные файлы, а затем цикл по массиву для вторичных серверов. Не забудьте сделать my_model->create() на каждой итерации.

...