Обновление пользовательского источника данных метода, не вызванного в cakeStack Overflow

Я пытаюсь обновить данные, используя пользовательский источник данных. Но когда я вызываю 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();
}
}

Благодарю.

3

Решение

Передача идентификатора не означает автоматически, что это будет обновление. Рассмотрим случай сохранения с помощью 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]