Я смог использовать метод 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;
ускорит процесс, и в то же время позволит мне восстановить любые недопустимые записи.
Итог, если вам нужно сохранить дополнительные данные в объединениизаписи таблицы, вы должны обрабатывать их по одной за раз.Если нет, используйте метод вверху для лучшей производительности.