无法使用 cakephp 在 1 个模型上保存所有内容
cant saveall on 1 model with cakephp
我无法将所有记录保存到模型 1。我有一个数字数组,我添加了一个模型名称。
为了保存单个模型的多条记录,$data
需要是记录的数字索引数组:'我这样做了,还尝试了很多以 Tutor 为键的变体。我没有得到任何保存,因为我收到下面的错误消息。我不知道我做错了什么,但对于这样一个常见的功能来说,它不能太多。我查看了其他帖子,但看不到我的错误。
http://book.cakephp.org/2.0/en/models/saving-your-data.html
if ($this->request->is('post') || $this->request->is('put')) {
$tutordata=$this->request->data['Tutor'];
//debug( $tutordata);
$data=array();
$this->Tutor->create();
foreach ($tutordata as $key => $item):
$data['Tutor'][$key]['id']=$item['id'];
$data['Tutor'][$key]['payrate_10']=$item['payrate_10'];
$data['Tutor'][$key]['payrate_vce']=$item['payrate_vce'];
$data['Tutor'][$key]['payrate_assessment']=$item['payrate_assessment'];
endforeach;
debug( $data);
// $data=$this->request->data['Tutor'];
// if ($this->Tutor->saveAll($data)){
if ($this->Tutor->saveAll($data['Tutor'])){
// return $this->redirect(array('action' => 'edit_paycycle'));
$this->Session->setFlash(__('Your Pay Rates have been saved .'));
}
else{
$this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
}
}
这是数据array
array(
'Tutor' => array(
(int) 0 => array(
'id' => '13',
'payrate_10' => '25.00',
'payrate_vce' => '25.00',
'payrate_assessment' => '50.00'
),
(int) 1 => array(
'id' => '7',
'payrate_10' => '30.00',
'payrate_vce' => '45.00',
'payrate_assessment' => '0.00'
),
....
)
);
很抱歉这么说,但您对 saveall 的使用很尴尬。使用 save 你通常想要创建新记录并且不指定 id 字段。
因此,您可能会遇到问题,因为 cakephp 需要更新并且其中一个 ID 已经存在于数据库中。
顺便说一句。您可以使用以下方法简化您的 foreach:
foreach ($tutordata as $item){
$data['Tutor'][] = [
'id'=>$item['id'],
'payrate_10'=>$item['payrate_10'],
'payrate_vce'=>$item['payrate_vce'],
'payrate_assessment'=>$item['payrate_assessment']
];
};
您可以使用 saveMany 而不是使用 saveAll,因为您只保存一个模型的数据。如果您将数值数组传递给 saveAll(就像您所做的那样),它会自动映射到 saveMany,但您会保存映射。
编辑: 所以现在我遇到了你的问题 :) cake 无法知道 phone 是否已经设置,因此对当前条目的验证将 return一个错误。
那么您可以采取以下措施来解决这个问题:
关闭常规验证:
http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array 并对您想要的字段进行特定验证。
或者在您的视图中创建隐藏字段以保留实际值。
或者最后也是最糟糕的解决方案:创建一个 $model->find('all') 并把它与你视图中的输入合并。
编辑:
最有可能的最好的事情是,如果你只是在你的模型 http://book.cakephp.org/2.0/en/models/data-validation.html#required
中用 notEmpty 替换 required
如果您尝试更新现有行,则不应使用 $this->Tutor->create();
,因为这会指示 Cake 创建新记录。这可能是您遇到问题的原因。
除了将要保存的字段列入白名单之外,您的 foreach 循环似乎没有什么意义,这可以使用 fieldList
选项来完成:-
if ($this->request->is('post') || $this->request->is('put')) {
$result = $this->Tutor->saveMany(
$this->request->data['Tutor'],
'fieldList' => array(
'Tutor' => array(
'id',
'payrate_10',
'payrate_vce',
'payrate_assessment'
)
)
);
if ($result !== false) {
$this->Session->setFlash(__('Your Pay Rates have been saved .'));
} else {
$this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
}
}
正如其他人所说,没有必要使用 saveAll()
,因为您要保存同一模型的许多行,因此 saveMany()
更合适。 saveAll()
应该避免,因为它暗示您不确定您实际要保存什么;它主要用于 backwards compatiblity:-
This function receives the same options as the former two, and is
generally a backwards compatible function. It is recommended using
either saveMany or saveAssociated depending on the case.
我无法将所有记录保存到模型 1。我有一个数字数组,我添加了一个模型名称。
为了保存单个模型的多条记录,$data
需要是记录的数字索引数组:'我这样做了,还尝试了很多以 Tutor 为键的变体。我没有得到任何保存,因为我收到下面的错误消息。我不知道我做错了什么,但对于这样一个常见的功能来说,它不能太多。我查看了其他帖子,但看不到我的错误。
http://book.cakephp.org/2.0/en/models/saving-your-data.html
if ($this->request->is('post') || $this->request->is('put')) {
$tutordata=$this->request->data['Tutor'];
//debug( $tutordata);
$data=array();
$this->Tutor->create();
foreach ($tutordata as $key => $item):
$data['Tutor'][$key]['id']=$item['id'];
$data['Tutor'][$key]['payrate_10']=$item['payrate_10'];
$data['Tutor'][$key]['payrate_vce']=$item['payrate_vce'];
$data['Tutor'][$key]['payrate_assessment']=$item['payrate_assessment'];
endforeach;
debug( $data);
// $data=$this->request->data['Tutor'];
// if ($this->Tutor->saveAll($data)){
if ($this->Tutor->saveAll($data['Tutor'])){
// return $this->redirect(array('action' => 'edit_paycycle'));
$this->Session->setFlash(__('Your Pay Rates have been saved .'));
}
else{
$this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
}
}
这是数据array
array(
'Tutor' => array(
(int) 0 => array(
'id' => '13',
'payrate_10' => '25.00',
'payrate_vce' => '25.00',
'payrate_assessment' => '50.00'
),
(int) 1 => array(
'id' => '7',
'payrate_10' => '30.00',
'payrate_vce' => '45.00',
'payrate_assessment' => '0.00'
),
....
)
);
很抱歉这么说,但您对 saveall 的使用很尴尬。使用 save 你通常想要创建新记录并且不指定 id 字段。 因此,您可能会遇到问题,因为 cakephp 需要更新并且其中一个 ID 已经存在于数据库中。
顺便说一句。您可以使用以下方法简化您的 foreach:
foreach ($tutordata as $item){
$data['Tutor'][] = [
'id'=>$item['id'],
'payrate_10'=>$item['payrate_10'],
'payrate_vce'=>$item['payrate_vce'],
'payrate_assessment'=>$item['payrate_assessment']
];
};
您可以使用 saveMany 而不是使用 saveAll,因为您只保存一个模型的数据。如果您将数值数组传递给 saveAll(就像您所做的那样),它会自动映射到 saveMany,但您会保存映射。
编辑: 所以现在我遇到了你的问题 :) cake 无法知道 phone 是否已经设置,因此对当前条目的验证将 return一个错误。
那么您可以采取以下措施来解决这个问题:
关闭常规验证: http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array 并对您想要的字段进行特定验证。
或者在您的视图中创建隐藏字段以保留实际值。
或者最后也是最糟糕的解决方案:创建一个 $model->find('all') 并把它与你视图中的输入合并。
编辑: 最有可能的最好的事情是,如果你只是在你的模型 http://book.cakephp.org/2.0/en/models/data-validation.html#required
中用 notEmpty 替换 required如果您尝试更新现有行,则不应使用 $this->Tutor->create();
,因为这会指示 Cake 创建新记录。这可能是您遇到问题的原因。
除了将要保存的字段列入白名单之外,您的 foreach 循环似乎没有什么意义,这可以使用 fieldList
选项来完成:-
if ($this->request->is('post') || $this->request->is('put')) {
$result = $this->Tutor->saveMany(
$this->request->data['Tutor'],
'fieldList' => array(
'Tutor' => array(
'id',
'payrate_10',
'payrate_vce',
'payrate_assessment'
)
)
);
if ($result !== false) {
$this->Session->setFlash(__('Your Pay Rates have been saved .'));
} else {
$this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
}
}
正如其他人所说,没有必要使用 saveAll()
,因为您要保存同一模型的许多行,因此 saveMany()
更合适。 saveAll()
应该避免,因为它暗示您不确定您实际要保存什么;它主要用于 backwards compatiblity:-
This function receives the same options as the former two, and is generally a backwards compatible function. It is recommended using either saveMany or saveAssociated depending on the case.