我正在尝试使用自定义数据源更新数据。但是当我在设置id后调用save时,它正在调用create方法。我还记录了$ Model,并且id中的id为null。由于id字段为null,因此调用create方法而不是update。
以下是我在Model beforesave
中记录$ Model时的id值[useTable] => applications
[id] => 191124
[data] => Array
(
[Application] => Array
(
[id] => 191124
[Field] => Array
(
[0] => Array
(
[@id] => 13312
[@type] => 1
[@value] => 10317
)
)
)
)
当我在create id字段中记录$ Model时为
[useTable] => applications
[id] =>
[data] => Array
(
[Application] => Array
(
[id] => 191124
[Field] => Array
(
[0] => Array
(
[@id] => 13312
[@type] => 1
[@value] => 10317
)
)
)
)
我使用以下代码调用save
$data = array(
'id' => $archer_id,
'Field' => array(
array(
'@id' => 13312,
'@type' => 1,
'@value' => 10317
)
)
);
$this->Application->id = $archer_id;
$this->Application->save($data,false);
我正在使用的模型是
class Application extends ArcherAppModel {
public $hasMany = array('Archer.Assessment');
public $_schema = array(
'Field' => array('type' => 'array')
);
public function beforeSave( $options = array() ) {
$this->log(array("message" => "Data in application before save ","data" => $this->data),'debug');
return true;
}
}
数据源代码中的读取功能是
public function read ( Model &$Model, $queryData = array(), $recursive = null ) {
$this->Model = $Model;
try {
$mid = $this->get_module_id();
$key = $Model->alias . ".id";
if ( array_key_exists( $key, $queryData['conditions'] ) ) $rid = $queryData['conditions'][$key];
elseif ( $Model->id ) $rid = $Model->id;
else $params = $queryData['conditions'];
$params = $this->_params(array(
"moduleId" => $mid,
"contentId"=>$rid
));
$results = $this->_getSoap('records')->__soapCall('GetRecordById', array('GetRecordById' => $params));
if ( property_exists( $results, 'GetRecordByIdResult' ) ) return Xml::build($results->GetRecordByIdResult);
return array();
} catch ( Exception $e ) {
$this->log("OH No...");
$this->log($e->getMessage());
return array();
}
}
感谢。
答案 0 :(得分:1)
传递ID并不意味着它将是一次更新。考虑使用mysql保存的情况,其中主键字段不自动增量 - CakePHP的模型层也支持这种(非常常见)的情况,其中插入和更新具有固定的主键值工作
保存方法的工作方式是check if the id exists,如果不是保存方法clears the model id:
if (!$exists && $count > 0) {
$this->id = false;
}
if (!empty($this->id)) {
... update ...
} else {
... insert ...
}
问题中提到的自定义数据源没有显示,但它似乎没有实现"这个ID是否存在?"。那个或模型的存在方法(which is just a count, if it issues a query to the datasource)因其他原因而返回false。
要确定自己是否是插入更新,请检查Model::exists
中的主要按键调用无法正常工作并修复数据源,或覆盖ModelName::exists
实现任何必要的逻辑,即:
// Application Model
public function exists($id = null) {
if (should be an update) {
return true;
}
return false;
}