更新在cakephp中未调用的方法自定义数据源

时间:2015-10-07 06:54:11

标签: php cakephp model-view-controller cakephp-2.0 datasource

我正在尝试使用自定义数据源更新数据。但是当我在设置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();
    }
}

感谢。

1 个答案:

答案 0 :(得分:1)

传递ID并不意味着它将是一次更新。考虑使用mysql保存的情况,其中主键字段自动增量 - CakePHP的模型层也支持这种(非常常见)的情况,其中插入和更新具有固定的主键值工作

保存方法的工作方式是check if the id exists,如果不是保存方法clears the model id

if (!$exists && $count > 0) {
    $this->id = false;
}

an insert, not an update的后果。

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;
}