资讯专栏INFORMATION COLUMN

phalcon中save方法的用法和update方法

Render / 1627人阅读

摘要:我们来看看一个方法用法。中的方法,他是一个集添加和修改与一身的一个方法。在上面的这个方法中他会自动识别,在数组中有没有主键,主键存在执行修改执行添加但是我们会发现,将中没有的字段,他会清空。

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

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

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

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

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

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

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

/**
     * 封装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 PhalconMvcModelMetaDataInterface 
     */
    public function getModelsMetaData() {}

zephir源码

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

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

            let dependencyInjector =  this->_dependencyInjector;

            /**
             * Obtain the models-metadata service from the DI
             */
            let metaData =  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 PhalconMvcModelInterface $model 
     * @return array 
     */
    public function getAttributes(PhalconMvcModelInterface $model);

还有skipAttributesOnUpdate

/**
     * Sets a list of attributes that must be skipped from the
     * generated UPDATE statement
     * 
     * skipAttributesOnUpdate(array("modified_in"));
     * }
     * }
     * 
     *
     * @param array $attributes 
     */
    protected function skipAttributesOnUpdate(array $attributes) {}

zephir源码

    /**
     * Sets a list of attributes that must be skipped from the
     * generated UPDATE statement
     *
     *
     * skipAttributesOnUpdate(
     *             [
     *                 "modified_in",
     *             ]
     *         );
     *     }
     * }
     *
     */
    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);

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22362.html

相关文章

  • 【踩过坑】[web]1.生产与灰度数据缓存;2.Mysql主从不同步;

    摘要:方法,如图总结因为灰度环境在公司内网,访问量较小,相比方法,方法可以暂时解决灰度测试时的缓存问题。但是仍然存在风险。 背景:php做web开发,MVC,phalcon 1.生产与灰度数据缓存 原因: service层获取数据,有新增数据字段; controller层是通过redisCache调用service接口; redisCache采用redis-file双缓存结构,可能存在...

    sixgo 评论0 收藏0
  • PHP框架Phalcon 之 ACL

    摘要:一般至少要在执行路由前要判断用户是否具有权限一般在中,所以应该在它之前获得填充。以下代码可参考这里的方法就是重点。参考这里把对象保存在中。 showImg(https://segmentfault.com/img/bVkdih); 使用如下图解释这个组件: showImg(https://segmentfault.com/img/bVkdii); 实际最终真正要使用的是access_l...

    mikyou 评论0 收藏0
  • PHP-Phalcon框架数据库操作

    摘要:本文描述了框架中数据库操作方法,主要讨论框架的组件中的操作方法。属性方法在框架中支持属性的扩展查询,在上例中,可以把条件语句改为同时省略查询条件结果不变。 本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法。更详细的Model介绍请参考:官方文档 1. 连接数据库 在Phalcon框架中,通过在DI中注入db参数来实现数据库的...

    xiaotianyi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<