Я использую Cake 1.2.6, и вчера вечером я заметил, что отношения HABTM не сохранялись при отправке формы.
У меня есть отношение HABTM между Committee
и Volunteer
. Первичный ключ для Volunteer
- это UUID, а первичный ключ для Committee
- это читаемая человеком строка (например, BOARDOFDIRECTORS
, FAIRCOMMITTEE
, FAIRASSOCIATES
и т. Д.). У меня есть форма для создания / редактирования добровольцев, и эта форма включает в себя поле выбора, параметры которого точно соответствуют вашим ожиданиям, и в них содержатся параметры, возвращаемые методом Cake find( 'list' )
. Хотя я не могу придумать причину, по которой это имело бы значение, для добровольца может быть выбран только один комитет (HABTM предназначен для ожидаемых будущих потребностей).
Первоначальные результаты показывают, что выбор опции BOARDOFDIRECTORS
работает, как и ожидалось, но другие - нет. Отслеживание выполнения через основной код приводит меня к Model->__saveMulti()
, где в Строка 1393 этот код выполняется:
$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;
Если я дам дамп $data
перед этим кодом, вывод будет FAIRASSOCIATES . Сразу после этого его значение равно 4AIRASSOCIATES . Кажется безопасным предположить, что именно поэтому отношения не сохраняются, но я не выяснил, почему данные изменяются на этом этапе выполнения.
Кто-нибудь еще видел это? Я пропустил какой-то критический кусок? Насколько мне известно, это работало нормально в v1.2.1 (я обновил неделю назад или около того).
UPDATE
Первый бит кажущейся странности, который я вижу, состоит в том, что, хотя мой $row
является строкой, условие в Строка 1366 оценивается как true
, поэтому я перехожу кодовый блок. Если мои данные являются строкой, как они могут иметь значение члена?
UPDATE
У меня явно есть кое-какие мысли, но вот суть. Если я сбрасываю записи журнала непосредственно перед и сразу после Строка 1394 примерно так:
$this->log( 'Setting ' . $data . '[' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] . '] = ' . $id, LOG_DEBUG );
$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id;
$this->log( 'Creating ' . json_encode( $data ) . ' on ' . $join, LOG_DEBUG );
Соответствующий вывод:
2010-03-05 18:57:08 Debug: Setting FAIRASSOCIATES[volunteer_id] = 4b78717f-8ad4-4671-b81c-4e8745591fb4
2010-03-05 18:57:08 Debug: Creating "4AIRASSOCIATES" on CommitteesVolunteer
Возможные проблемы:
- Я не уверен, как / почему Cake пытается установить член
volunteer_id
в строку
- "FAIRASSOCIATES" - это идентификатор комитета, в который входит добровольец, а не модель какого-либо рода, поэтому я вообще не понимаю значения
FAIRASSOCIATES[volunteer_id]
.
- Я понятия не имею, как или почему значение
$data
превращается в 4AIRASSOCIATES
этой одной строкой кода.