Я пытаюсь обновить данные, используя пользовательский источник данных. Но когда я вызываю save после установки идентификатора, он вызывает метод create. Я также зарегистрировал $ Model, и в этом идентификатор становится нулевым. Поскольку поле id имеет значение null, вместо update вызывается метод create.
Ниже приведено значение id, когда я регистрирую $ Model в Model beforesave
[useTable] => applications
[id] => 191124
[data] => Array
(
[Application] => Array
(
[id] => 191124
[Field] => Array
(
[0] => Array
(
[@id] => 13312
[@type] => 1
[@value] => 10317
)
)
)
)
и когда я регистрирую $ Model в поле создания идентификатора, становится пустым как
[useTable] => applications
[id] =>
[data] => Array
(
[Application] => Array
(
[id] => 191124
[Field] => Array
(
[0] => Array
(
[@id] => 13312
[@type] => 1
[@value] => 10317
)
)
)
)
Я звоню сохранить, используя приведенный ниже код
$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();
}
}
Благодарю.
Передача идентификатора не означает автоматически, что это будет обновление. Рассмотрим случай сохранения с помощью mysql, где поле первичного ключа не autoincrement — этот (очень распространенный) случай также поддерживается на уровне модели CakePHP, где работают вставка и обновление с фиксированным значением первичного ключа.
Метод сохранения работает так: проверьте, существует ли идентификатор, и если это не метод сохранения очищает идентификатор модели:
if (!$exists && $count > 0) {
$this->id = false;
}
Следствием этого бытия вставка, а не обновление.
if (!empty($this->id)) {
... update ...
} else {
... insert ...
}
Упомянутый в вопросе пользовательский источник данных не показан, но может показаться, что он не реализует «существует ли этот идентификатор?». Это или метод существующего метода (это просто счетчик, если он выдает запрос к источнику данных) возвращает false по другой причине.
Чтобы определить, является ли это вставкой обновления, либо проверьте, почему вызов find-by-primary-key в Model::exists
не работает и не исправляет источник данных, или переопределяет ModelName::exists
реализовать любую необходимую логику, т.е.
// Application Model
public function exists($id = null) {
if (should be an update) {
return true;
}
return false;
}
Других решений пока нет …