CakePHP с помощью saveAll: Как сохранить дополнительные данные с помощью записи ссылки HABTM? - PullRequest
1 голос
/ 27 февраля 2011

Я смог использовать метод saveAll в CakePHP для одновременного создания «Членов» и регистрации их в «Событии» (создание записи ссылки HABTM), что является потрясающим.Например, этот код создает два новых элемента «Members» и добавляет запись для каждого из них в таблицу «EventsMember», регистрируя их «Event» 10:

$data = array(
  '0' => array(
    'Member' => array('email' => 'nobody@nowhere.com'),
    'Event' => array('id' => 10)
  ),
  '1' => array(
    'Member' => array('email' => 'somebody@nowhere.com'),
    'Event' => array('id' => 10)
  )
);
$this->Member->saveAll($data);

Однако запись в «EventsMember»Таблица также имеет поле под названием «роль», которое содержит что-то вроде «Ведущий», «Хост» или «Посетитель», и я хотел бы сохранить эти данные при создании отношения.Я попробовал это, и это не работает (поле роли 'EventsMember' всегда пусто):

$data = array(
  '0' => array(
    'Member' => array('email' => 'nobody@nowhere.com'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Host')
  ),
  '1' => array(
    'Member' => array('email' => 'somebody@nowhere.com'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Attendee')
  )
);
$this->Member->saveAll($data);

Мне интересно, возможно ли это вообще, и если возможно, мне придется использовать какое-тообратного вызова, как beforeSave или afterSave, чтобы сделать это?Я читал, что есть некоторые проблемы с этими обратными вызовами при использовании saveAll, поэтому я ищу какие-либо советы о том, что было бы лучшим вариантом здесь.

Спасибо!

РЕДАКТИРОВАТЬ: IВоспользовавшись советом Адама и внеся следующие изменения в мои модели:

// Event.php
var $hasMany = array('EventsMember');

// Member.php
var $hasMany = array('EventsMember');

// EventsMember.php
var $belongsTo = array('Event', 'Member');

Затем в моем контроллере мой код выглядел почти идентично моему второму примеру, за исключением того, что я вызвал метод saveAll() из модели EventsMember, как описано в документации:

$data = array(
  '0' => array(
    'Member' => array('email' => 'nobody@nowhere.com'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Host')
  ),
  '1' => array(
    'Member' => array('email' => 'somebody@nowhere.com'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Attendee')
  )
);
$this->EventsMember->saveAll($data);

Результатом было отсутствие Member или EventsMember записей, которые вообще были сохранены.Я попытался вызвать сохранение из модели Member ($this->Member->saveAll($data);), и это сохранило записи Member, но не присоединяющиеся записи EventsMember.

Я попытался удалить существующие ранее ассоциации HABTM,и это не имело никакого значения.Метод beforeSave модели EventsMember срабатывает, когда я вызываю $this->EventsMember->saveAll($data);, но похоже, что он ничего не спасет.

Я в тупике.

ОБНОВЛЕНИЕ: Оказывается, что никаких записей не было создано, потому что все присоединяющиеся записи создавались с идентификаторами событий и идентификаторами участников, равными 0, что противоречит уникальному ключу, который у меня есть для этих двух полей вместе (то есть ни один участник не может зарегистрироваться в событиидважды).

Предполагает ли это, что функциональность saveAll в модели соединения не работает так, как описано в документации, поскольку запись члена не создается (имеется в виду, что в записи присоединения нет идентификатора члена), исуществующий Идентификатор события также не передается в присоединяющуюся запись EventsMember?

ИСТОРИЯ: Я изменил контроллер на цикл для каждой записи и попытался $this->EventsMember->saveAll($data) для каждого индекса массива вместо передачи всего массиваоднажды.Это сработало, но было значительно медленнее, чем в моем первом примере (на самом верху).Имейте в виду, я использую транзакции, так что, возможно, использование опции atomic => false; ускорит процесс, и в то же время позволит мне восстановить любые недопустимые записи.

Итог, если вам нужно сохранить дополнительные данные в объединениизаписи таблицы, вы должны обрабатывать их по одной за раз.Если нет, используйте метод вверху для лучшей производительности.

1 Ответ

1 голос
/ 27 февраля 2011

В этом случае вы можете использовать Модель соединения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...