2015-11-25 4 views
1

У меня есть две модели, а именно продукт и 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.

ответ

2

Ваши сохранить данные должны выглядеть следующим образом: -

array(
    'Product' => array(
     'id' => '2' 
    ), 
    'ProductSpecification' => array(
     array(
      'title' => 'test', 
      'step' => '1', 
      'position' => '1' 
     ) 
    ) 
); 

Значения ProductSpecification должны передаваться как численно индексированный массив для hasMany отношений.

Кроме того, убедитесь, что вы используете saveAssociated(), а не saveAll(), поскольку вы передаете связанные данные, поэтому нет необходимости использовать метод обертки (чего следует избегать, когда это возможно).

+0

О, мужик, ты совершенно прав. Я предположил, что он также работал для отношений hasMany, если вы назовете функцию saveAssociated. – pbond

+0

То, что у вас было, было бы правильным для ассоциации 'ownTo'. 'saveAssociated()' проверяет ассоциацию модели для определения ожидаемой структуры данных для сохранения, поэтому ожидает массив записей 'ProductSpecification' в вашем случае. 'saveAll()' - это только метод-оболочка, поэтому по-прежнему вызовите 'saveAssociated()'. Поскольку вы действительно должны знать, какие данные вы планируете сохранять, я всегда рекомендую избегать 'saveAll()', поскольку это не нужно. – drmonkeyninja

+1

А, я не знал, что 'saveAssociated' проверил ассоциацию модели, чтобы определить ее, я ожидал, что она проверит числовые индексы или нет. Благодаря! Я фактически заменил 'saveAssociated' на' saveAll', чтобы узнать, работает ли это, поскольку я всегда использую 'saveAssociated' или' saveMany' в зависимости от ситуации. Только что выяснилось, что он функционирует только как обертка для двух. – pbond

Смежные вопросы