У меня есть две модели, а именно продукт и ProductSpecification, которые имеют следующие соотношения в месте:CakePHP - saveAssociated/SaveAll ведет себя как saveMany
(Product Model)
public $hasMany = array(
'ProductSpecification' => array(
'className' => 'ProductSpecification',
'foreignKey' => 'product_id',
'dependent' => true
)
);
и
(ProductSpecification Model)
public $belongsTo = array(
'Product' => array(
'className' => 'Product',
'foreignKey' => 'product_id'
)
);
Использование помощника CakePHP формы я отправляю ProductSpecification, а затем я использую метод saveAll
(или saveAssociated
, я попробовал оба), чтобы сохранить данные. debug($this->request->data)
дает мне следующий результат после регистрации:
array(
'Product' => array(
'id' => '2'
),
'ProductSpecification' => array(
'title' => 'test',
'step' => '1',
'position' => '1'
)
)
Это здорово, правда? .. Теперь линия после отладки я использую следующий код, чтобы сохранить (я также попытался saveAssociated):
if($this->Product->saveAll($this->request->data))
По какой-то причине это экономит три пустые строки в моей ProductSpecification таблице, с только (!) product_id
раздел (и id
) комплект; поля title
, step
и position
пустые. Точно такое же поведение происходит, когда я запускаю saveAssociated
. Что я делаю не так?
Я запускаю CakePHP 2.x.
О, мужик, ты совершенно прав. Я предположил, что он также работал для отношений hasMany, если вы назовете функцию saveAssociated. – pbond
То, что у вас было, было бы правильным для ассоциации 'ownTo'. 'saveAssociated()' проверяет ассоциацию модели для определения ожидаемой структуры данных для сохранения, поэтому ожидает массив записей 'ProductSpecification' в вашем случае. 'saveAll()' - это только метод-оболочка, поэтому по-прежнему вызовите 'saveAssociated()'. Поскольку вы действительно должны знать, какие данные вы планируете сохранять, я всегда рекомендую избегать 'saveAll()', поскольку это не нужно. – drmonkeyninja
А, я не знал, что 'saveAssociated' проверил ассоциацию модели, чтобы определить ее, я ожидал, что она проверит числовые индексы или нет. Благодаря! Я фактически заменил 'saveAssociated' на' saveAll', чтобы узнать, работает ли это, поскольку я всегда использую 'saveAssociated' или' saveMany' в зависимости от ситуации. Только что выяснилось, что он функционирует только как обертка для двух. – pbond