CakePHP:SaveAll()并有许多数据替换问题

CakePHP:SaveAll()并有许多数据替换问题,cakephp,save,has-many,Cakephp,Save,Has Many,我与许多协会制作了一个大表格hasMany/HABTM。一切都很好地创造了(!)。当更新所有数据时,效果也很好,但在关联多的表中,数据不会更新或替换,而只是插入。这会带来许多包含垃圾数据的行。如何使saveAll()在多个字段中执行更新/替换: 型号: class MainModel extends AppModel { var $hasAndBelongsToMany = array( 'HABTMModel1', ... 'HABTMModeln', );

我与许多协会制作了一个大表格hasMany/HABTM。一切都很好地创造了(!)。当更新所有数据时,效果也很好,但在关联多的表中,数据不会更新或替换,而只是插入。这会带来许多包含垃圾数据的行。如何使saveAll()在多个字段中执行更新/替换:

型号:

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
首次创建和更新后的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插入未编辑的新值


谢谢。

您也需要为您的hasMany车型设置
id
字段,例如

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 *** );

您还需要为您的hasMany车型设置
id
字段,例如

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 *** );

在视图中,只需为所有Model1、Model2 ID放置隐藏输入


您可能会将Model1和Model2的“字段”指定为只有“name”。这就是$this->data看起来像这样的原因。因此,只需添加“id”即可。

在视图中,只需为所有Model1、Model2 id添加隐藏的输入


您可能会将Model1和Model2的“字段”指定为只有“name”。这就是$this->data看起来像这样的原因。所以只需添加“id”即可。

所以我制作的不是那么漂亮,而是工作:

// 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);

所以我做的不是那么漂亮,而是工作:

// 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);

谢谢你的支持!但是,不可能删除基于主模型id的所有数据(如在HABTM中)?在这种情况下,获取和设置Model1.id很困难。如果tehre能够根据主模型id更新/替换数据,那就容易多了。这是可能的?这是不可能的,因为如果没有id,就无法正确识别记录。是否有可能使用saveAll指定SQL查询?在视图/控制器中插入“id”是一项非常困难的工作。因此。。我为一个模特做的。现在数据与您编写的相同。是的,现在不会为每次保存创建重复条目。但是只有当我不更改数据时!!!如果(我有2010年、2011年、2012年、2013年的复选框)我编辑设置了所有4年的数据,那么在表中我有4条记录。现在,我取消选中最后一个(2013),因此要保存所有元素,只能使用3个数组元素。和没有什么变化。。Cake没有删除一条额外的记录。如果不能按照我的需要进行更新,Cake如何根据主\u模型\u id删除所有记录?谢谢你的回复!但是,不可能删除基于主模型id的所有数据(如在HABTM中)?在这种情况下,获取和设置Model1.id很困难。如果tehre能够根据主模型id更新/替换数据,那就容易多了。这是可能的?这是不可能的,因为如果没有id,就无法正确识别记录。是否有可能使用saveAll指定SQL查询?在视图/控制器中插入“id”是一项非常困难的工作。因此。。我为一个模特做的。现在数据与您编写的相同。是的,现在不会为每次保存创建重复条目。但是只有当我不更改数据时!!!如果(我有2010年、2011年、2012年、2013年的复选框)我编辑设置了所有4年的数据,那么在表中我有4条记录。现在,我取消选中最后一个(2013),因此要保存所有元素,只能使用3个数组元素。和没有什么变化。。Cake没有删除一条额外的记录。如果不能根据我的需要进行更新,Cake如何根据主模型id删除所有记录?不,添加echo$this->Form->hidden('Model1.0.id');不要这样做:(在我的例子中,'id'是空的,因为数据是通过javascript等解析后从json获取的(漫长的艰难之路,没有id,只有main_model_id),所以问题是实际的:(您最初从MainModel->find()方法获得数据,对吗?这就是您指定包含id的地方。不,添加echo$this->Form->hidden('Model1.0.id');不要这样做:(在我的例子中,'id'是空的,因为数据是通过javascript等解析后从json中获取的(漫长的艰难道路,没有id,只有main_model_id),所以问题是实际的:(您最初从MainModel->find()方法获得的数据,对吗?这就是您指定包含id的地方。