CakePHP: проблема с заменой данных в SaveAll () и hasMany - PullRequest
1 голос
/ 14 июля 2011

Я сделал одну большую форму со многими ассоциациями hasMany / HABTM. Все отлично работает над созданием (!). При обновлении все тоже работает хорошо, но в таблицах, где ассоциация имеет hasMany, данные не обновляются и не заменяются, а просто вставляются. Это приносит много строк с мусорными данными. Как я могу сделать, чтобы saveAll () выполнял обновление / замену в полях hasMany:

Модель:

class MainModel extends AppModel {

  var $hasAndBelongsToMany = array(
    'HABTMModel1',
    ...
    'HABTMModeln',
  );

  var $hasMany = array(
    'Model1' => array(
      'dependent' => true
     ),
     ...
    'Modeln' => array(
      'dependent' => true
    ),
  );
}

Одна из проблемных моделей имеет много моделей:

class Model1 extends AppModel {

  var $belongsTo = array(
    'MainModel'
  );
}

А на его столе есть:

id <- Primary key, auto increment, int (11)
main_model_id <- Foreign_key int (11)
name <- text field, string

Данные $ this-> выглядят так:

array(
  [MainModel] => array(
    'id' => 123
    *** aditional data named identicaly to table fields (working great)***
  ),
  [Model1] => array(
    [0] => array(
      [name] => Test1
    ),
    [2] => array(
      [name] => Test2
    ),
  ),
  *** all other models ***
);

Результаты таблицы Model1 после первого создания и после обновления:

id        main_model_id        name
--------------------------------------------------------------
11        306                 Test1
12        306                 Test2
13        306                 Test1  (Thease are dublicates)
14        306                 Test2  (Thease are dublicates)

Что я могу сделать, чтобы обновить / заменить данные в hasMany и не вставлять новые значения без редактирования с помощью saveAll?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

В представлении просто поместите скрытый ввод для всех идентификаторов Model1, Model2

echo $form->create('MainModel');
echo $form->hidden('Model1.0.id');
// more stuffs...
echo $form->end('Save');

Вы, вероятно, задаете «поля» для Model1, Model2, чтобы иметь только «имя»,Вот почему $ this-> data выглядит так.Так что просто добавьте 'id' к этому.

3 голосов
/ 18 июля 2011

Так что я сделал не так красиво, но работает:

// If edit, then delete data from hasMany tables based on main_model_id
if(isset($this->data['MainModel']['id']) && !empty($this->data['MainModel']['id'])) {
  $conditions = array('main_model_id' => $this->data['MainModel']['id']);

  // Delete Model1
  $this->MainModel->Model1->deleteAll($conditions, false);

  ...
  all other models
  ...
}

$this->MainModel->saveAll($this->data);
0 голосов
/ 14 июля 2011

Вам нужно также установить поле id для вашей модели hasMany, например,

array(  
 [MainModel] => array(
    [id] => 123
    *** aditional data named identicaly to table fields (working great)***   ), 
  [Model1] => array(
    [0] => array(
      [id] => 1,
      [name] => Test1
    ),
    [2] => array(
      [id] => 2
      [name] => Test2
    ),   ),   *** all other models *** );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...