1

我们来看看一个save方法用法。

phalcon中的save方法,他是一个集 添加 和 修改 与一身的一个方法。

$this->someModel->save($data);

在上面的这个方法中他会自动识别,在$data 数组中有没有 主键,

if(主键存在){
    执行修改;
}else{
    执行添加
}

但是我们会发现,将$data 中没有的字段,他会清空。

下面由marserphalconCMS中我们可以看到,做了这样的处理

/**
     * 封装phalcon model的update方法,实现仅更新数据变更字段,而非所有字段更新
     * @param array|null $data
     * @param null $whiteList
     * @return bool
     */
    public function iupdate(array $data=null, $whiteList=null){
        if(count($data) > 0){
            $attributes = $this -> getModelsMetaData() -> getAttributes($this);
            $this -> skipAttributesOnUpdate(array_diff($attributes, array_keys($data)));
        }
        return parent::update($data, $whiteList);
    }

其中getModelsMetaData

 /**
     * Returns the models meta-data service related to the entity instance
     *
     * @return \Phalcon\Mvc\Model\MetaDataInterface 
     */
    public function getModelsMetaData() {}

zephir源码

    /**
     * Returns the models meta-data service related to the entity instance
     */
    public function getModelsMetaData() -> <MetaDataInterface>
    {
        var metaData, dependencyInjector;

        let metaData = this->_modelsMetaData;
        if typeof metaData != "object" {

            let dependencyInjector = <DiInterface> this->_dependencyInjector;

            /**
             * Obtain the models-metadata service from the DI
             */
            let metaData = <MetaDataInterface> dependencyInjector->getShared("modelsMetadata");
            if typeof metaData != "object" {
                throw new Exception("The injected service 'modelsMetadata' is not valid");
            }

            /**
             * Update the models-metadata property
             */
            let this->_modelsMetaData = metaData;
        }
        return metaData;
    }

和getAttributes

 /**
     * Returns table attributes names (fields)
     *
     * @param \Phalcon\Mvc\ModelInterface $model 
     * @return array 
     */
    public function getAttributes(\Phalcon\Mvc\ModelInterface $model);

还有skipAttributesOnUpdate

/**
     * Sets a list of attributes that must be skipped from the
     * generated UPDATE statement
     * <code>
     * <?php
     * class Robots extends \Phalcon\Mvc\Model
     * {
     * public function initialize()
     * {
     * $this->skipAttributesOnUpdate(array('modified_in'));
     * }
     * }
     * </code>
     *
     * @param array $attributes 
     */
    protected function skipAttributesOnUpdate(array $attributes) {}

zephir源码

    /**
     * Sets a list of attributes that must be skipped from the
     * generated UPDATE statement
     *
     *<code>
     * <?php
     *
     * class Robots extends \Phalcon\Mvc\Model
     * {
     *     public function initialize()
     *     {
     *         $this->skipAttributesOnUpdate(
     *             [
     *                 "modified_in",
     *             ]
     *         );
     *     }
     * }
     *</code>
     */
    protected function skipAttributesOnUpdate(array! attributes) -> void
    {
        var keysAttributes, attribute;

        let keysAttributes = [];
        for attribute in attributes {
            let keysAttributes[attribute] = null;
        }

        this->getModelsMetaData()->setAutomaticUpdateAttributes(this, keysAttributes);
    }

都是phalcon自带的

用下面方式进行保存

$result = $this -> iupdate($data);

这样就将数据被清空的问题解决了。


thinkeng
189 声望15 粉丝