精华内容
下载资源
问答
  • Thinkphp Save方法更新问题

    千次阅读 2016-08-16 10:00:33
    Save方法返回的是更新行数 如果更新数据和原数据相同,返回值为0; 所以判断是否更新成功需要判断 返回值是否===false;

    Save方法返回的是更新行数

    如果更新数据和原数据相同,返回值为0;


    所以判断是否更新成功需要判断 返回值是否===false;

    展开全文
  • 谨慎使用tp5 save方法更新数据

    万次阅读 2019-03-14 17:37:32
    最近使用tp5框架模型更新数据时出现了一点小问题: foreach($user as $k => $v) { ...当更新的数据一样,即使条件不一致时,save方法也不会更新数据。 解决方法: 加上isUpdate(true)更新...

    最近使用tp5框架模型更新数据时出现了一点小问题:

    foreach($user as $k => $v) {
    	if(某些条件满足) {
    		$this->save(['score'=>$v['score']],['id'=>$v['id']]);
    	}
    }
    

    当更新的数据一样,即使条件不一致时,save方法也不会更新数据。

    解决方法:
    加上isUpdate(true)更新数据。

    $this->isUpdate(true)->save(['score'=>$v['score']],['id'=>$v['id']]);
    

    tp5 update方法源码中也是使用这种方式

    /**
        * 更新数据
        * @access public
        * @param array      $data  数据数组
        * @param array      $where 更新条件
        * @param array|true $field 允许字段
        * @return $this
        */
       public static function update($data = [], $where = [], $field = null)
       {
           $model = new static();
           if (!empty($field)) {
               $model->allowField($field);
           }
           $result = $model->isUpdate(true)->save($data, $where);
           return $model;
       }
    

    补充一下官方文档:

    模型的新增和更新方法都是 save 方法,系统有一套默认的规则来识别当前的数据需要更新还是新增。

    • 实例化模型后调用save方法表示新增;
    • 查询数据后调用save方法表示更新;
    • save方法传入更新条件后表示更新;

    如果你的数据操作比较复杂,可以显式的指定当前调用 save 方法是新增操作还是更新操作。

    显式更新数据:

    // 实例化模型
    $user = new User;
    // 显式指定更新数据操作
    $user->isUpdate(true)
    ->save(['id' => 1, 'name' => 'thinkphp']);
    显式新增数据:
    $user = User::get(1);
    $user->name = 'thinkphp';
    // 显式指定当前操作为新增操作
    $user->isUpdate(false)->save();
    

    注意:

    1. 不要在一个模型实例里面做多次更新,会导致部分重复数据不再更新,正确的方式应该是先查询后更
      新或者使用模型类的 update 方法更新。
    2. 如果你调用save方法进行多次数据写入的时候,需要注意,第二次save方法的时候必须使用
      isUpdate(false),否则会视为更新数据。
    展开全文
  • save方法的返回值是影响的记录数,如果返回false则表示更新出错。 如果字段没有被修改,则返回0,并不是失败。所以这里我们只需要对返回值进行恒不等于判断即可。if($result !== false){}else{ }

    save方法的返回值是影响的记录数,如果返回false则表示更新出错。
    如果字段没有被修改,则返回0,并不是失败。所以这里我们只需要对返回值进行恒不等于判断即可。

    if($result !== false){
    
    }else{
    }
    展开全文
  • 直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便。本文提供便捷方法解决此问题。 核心思路 如果现在保存某User对象,首先根据主键查询这个User的最新对象,然后将此User对象的非空属性覆盖到...

    转载自:https://www.jianshu.com/p/4931fbc52ea1

    直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便。本文提供便捷方法解决此问题。

    核心思路

    如果现在保存某User对象,首先根据主键查询这个User的最新对象,然后将此User对象的非空属性覆盖到最新对象。

    核心代码

    直接修改通用JpaRepository的实现类,然后在启动类标记此实现类即可。

    主要是实现一个类:

    package com.tianyalei.giftmall.global.base;
    
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.BeanWrapper;
    import org.springframework.beans.BeanWrapperImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.jpa.repository.support.JpaEntityInformation;
    import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.util.StringUtils;
    
    import javax.persistence.EntityManager;
    import java.beans.PropertyDescriptor;
    import java.util.HashSet;
    import java.util.Optional;
    import java.util.Set;
    
    /**
     * @author wuweifeng wrote on 2018/12/4.
     */
    public class SimpleJpaRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> {
    
        private final JpaEntityInformation<T, ?> entityInformation;
        private final EntityManager em;
    
        @Autowired
        public SimpleJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
            super(entityInformation, entityManager);
            this.entityInformation = entityInformation;
            this.em = entityManager;
        }
    
        /**
         * 通用save方法 :新增/选择性更新
         */
        @Override
        @Transactional(rollbackFor = Exception.class)
        public <S extends T> S save(S entity) {
            //获取ID
            ID entityId = (ID) entityInformation.getId(entity);
            Optional<T> optionalT;
            if (StringUtils.isEmpty(entityId)) {
                //String uuid = UUID.randomUUID().toString();
                防止UUID重复
                //if (findById((ID) uuid).isPresent()) {
                //    uuid = UUID.randomUUID().toString();
                //}
                若ID为空 则设置为UUID
                //new BeanWrapperImpl(entity).setPropertyValue(entityInformation.getIdAttribute().getName(), uuid);
                //标记为新增数据
                optionalT = Optional.empty();
            } else {
                //若ID非空 则查询最新数据
                optionalT = findById(entityId);
            }
            //获取空属性并处理成null
            String[] nullProperties = getNullProperties(entity);
            //若根据ID查询结果为空
            if (!optionalT.isPresent()) {
                //新增
                em.persist(entity);
                return entity;
            } else {
                //1.获取最新对象
                T target = optionalT.get();
                //2.将非空属性覆盖到最新对象
                BeanUtils.copyProperties(entity, target, nullProperties);
                //3.更新非空属性
                em.merge(target);
                return entity;
            }
        }
    
        /**
         * 获取对象的空属性
         */
        private static String[] getNullProperties(Object src) {
            //1.获取Bean
            BeanWrapper srcBean = new BeanWrapperImpl(src);
            //2.获取Bean的属性描述
            PropertyDescriptor[] pds = srcBean.getPropertyDescriptors();
            //3.获取Bean的空属性
            Set<String> properties = new HashSet<>();
            for (PropertyDescriptor propertyDescriptor : pds) {
                String propertyName = propertyDescriptor.getName();
                Object propertyValue = srcBean.getPropertyValue(propertyName);
                if (StringUtils.isEmpty(propertyValue)) {
                    srcBean.setPropertyValue(propertyName, null);
                    properties.add(propertyName);
                }
            }
            return properties.toArray(new String[0]);
        }
    }
    

    然后在application类上加个注解即可

    @SpringBootApplication
    @EnableJpaRepositories(repositoryBaseClass = SimpleJpaRepositoryImpl.class)
    public class GiftmallApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GiftmallApplication.class, args);
        }
    
        @Bean
        public ObjectMapper objectMapper() {
            return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        }
    }

    这样,所有的save方法都会进入到上面类的逻辑里,进行null字段的排除后更新。

     

     

    展开全文
  • 直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便。本文详细的介绍了如何解决这个问题,非常具有实用价值,需要的朋友可以参考下
  • thinkphp save方法 默认返回值为受影响行数。
  • thinkphp之数据库更新操作方法save

    千次阅读 2017-04-29 15:47:18
    更新数据使用save方法,例如: $User = M("User"); // 实例化User对象$condi=array('eq',$id); // 要修改的数据对象属性赋值$data['name'] = 'ThinkPHP';$data['email'] = 'ThinkPHP@gmail.com';$User->where($...
  • 1、使用save方法进行数据更新 //实体类 @Entity public class Student extends JpaRepositoriesAutoConfiguration{ private Integer id; private String name; private Integer age; //省略getter/setter方法...
  • CrudRepository Save方法

    千次阅读 2019-06-04 15:16:19
    CrudRepository 中的save方法源代码 @Transactional public <S extends T> S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity);//是新的就插入 return ...
  • save($data); if($result) { echo 'success'; }else{ echo 'false'; } 这种情况下,如果数据没有更新(与原数据相同),返回值判断为false 解决办法: $result = $Model->where('id=1')->...
  • 实体文件中写@DynamicInsert(true)从而实现 ...在使用save函数保存数据时如果实例对象某个属性为null时则不写入数据库中。 如果不使用此注解则会把null写入数据库中,数据库中该字段变为null值。 ...
  • MongoRepository接口 save方法

    千次阅读 2020-02-29 21:50:42
    MongoRepository接口 save方法 项目中一些页面资料是是使用 MongoDB进行存储,在编写接口的过程中,碰到XXXPageRepository(项目自定义类,继承了MongoRepository)的save方法。 MongoDB进行数据添加时有两种方法: ...
  • 主要介绍了JPA save()方法将字段更新为null的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • hibernate执行save方法之后(未提交事务)立刻执行flush方法为什么会执行更新操作?而且每执行一次flush方法就会打印一条update语句?这是为何?请各位大神指教!
  • 最近使用JpaRepository方法,发现有个字段一直没有修改成功; 最后发现实体类加了注解updatable = false,如下 @Column(name = "patient_package_id", length = 64, updatable = false) private String ...
  • 主要介绍了Django model重写save方法及update踩坑详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Thinkphp 批量更新方法 saveALL

    千次阅读 2017-12-26 16:57:00
    批量更新只适用于一个字段的更新,原理是用自定义函数拼接sql语句,然后再执行sql语句.   //数据 $data[]=array('id'=>1,'value'=>value1); $data[]=array('id'=>2,'value'=>value2); $data[]=...
  • 使用jpa的savell 方法出现的问题 我用个list记录错误参数集合,为什么程序已经return出去"error"的时候,还是更新了表。这里为什么我用来更新的集合里只要不为空就会更新,调试了半天理解不了,我不是return出去了吗...
  • 如果将@Modifying(clearAutomatically = true),clearAutomatically为true,则save方法必须放在所有@Query方法后面
  • 今天使用jpa的save方法时发现null字段也会被更新到数据库,这个直接把数据库数据覆盖的行为很可怕,果断研究了一下怎样能不保存null值。 解决方案: 实体类加@DynamicInsert(true)/@DynamicUpdate(true)注解; ...
  • 我们来看看一个save方法用法。 phalcon中的save方法,他是一个集 添加 和 修改 与一身的一个方法。 $this->someModel->save($data); 在上面的这个方法中他会自动识别,在$data 数组中有没有 主键, if(主键...
  • 实现CrudRepository接口的save方法进行记录更新时,遇到了更新记录反而插入新纪录的情况,经过探究发现,还是对源码不熟,对该方法的逻辑未清晰。下面通过这个bug来探究CrudRepository接口的save方法的记录判断。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,235
精华内容 74,894
关键字:

save方法更新