精华内容
下载资源
问答
  • 本篇文章主要介绍了Laravel 批量更新多条数据的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了Laravel实现批量更新多条数据,需要的朋友可以参考下
  • Laravel批量更新多条数据

    万次阅读 2019-09-04 11:01:58
    前言 ...因为项目是Laravel框架,Laravel批量插入的方法,却没有批量更新的方法,没办法只能自己实现。 准备 mysql case…when的用法 MySQL 的 case when 的语法有两种: 简单函数 CASE [col_na...

    前言

    近期在刷新生产环境数据库的时候,需要更新表中的字段,如果对每条数据结果都执行一次update语句,占用的数据库资源就会很多,而且速度慢,显得也不高大上。

    因为项目是Laravel框架,Laravel有批量插入的方法,却没有批量更新的方法,没办法只能自己实现。

    准备

    mysql case…when的用法

    MySQL 的 case when 的语法有两种:

    1. 简单函数
    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
    

    CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚举这个字段所有可能的值

    select id,status '状态值', case status
    when 10 then '未开始'
    when 20 then '配送中'
    when 30 then '已完成'
    when 40 then '已取消'
    End '状态'
    from table
    

    输出结果:
    在这里插入图片描述

    1. 搜索函数
    CASE WHEN [expr] THEN [result1]…ELSE [default] END
    

    CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

    select id,lessee_id '租户ID', case 
    when lessee_id <=1 then '自用系统'
    when lessee_id >1  then '租用系统'
    End '系统分类'
    from waybill_base_info
    

    在这里插入图片描述

    case…when实现数据库的批量更新

    更新单列的值

    UPDATE base_info SET
        city_id = CASE id
            WHEN 1 THEN 100010
            WHEN 2 THEN 100011
            WHEN 3 THEN 100012
        END
    WHERE id IN (1,2,3)
    

    这句sql的意思是,更新city_id 字段:

    1. 如果id=1 则city_id 的值为100010,
    2. 如果id=2 则 city_id 的值为100011,
    3. 如果id=3 则 city_id 的值为100012。
      即是将条件语句写在了一起。

    这里的where部分不影响代码的执行,但是会提高sql执行的效率。

    确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

    更新多列的值

    UPDATE base_info SET
    city_id = CASE id
    WHEN 1 THEN 100010
    WHEN 2 THEN 100011
    WHEN 3 THEN 100012
    END,
    city_name = CASE id
    WHEN 1 THEN ‘北京’
    WHEN 2 THEN ‘上海’
    WHEN 3 THEN ‘广州’
    END
    WHERE id IN (1,2,3)

    不过这个有个缺点 : 要注意的问题是SQL语句的长度,需要考虑程序运行环境所支持的字符串长度,当然这也可以更新mysql的设置来扩展。

    Laravel实现批量更新

    在model方法中封装该批量更新的方法:

    //批量更新
        public function updateBatch($multipleData = [])
        {
            try {
                if (empty($multipleData)) {
                    Log::info("批量更新数据为空");
                    return false;
                }
                $tableName = $this->table; // 表名
                $firstRow = current($multipleData);
    
            $updateColumn = array_keys($firstRow);
            // 默认以id为条件更新,如果没有ID则以第一个字段为条件
            $referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
            unset($updateColumn[0]);
            // 拼接sql语句
            $updateSql = "UPDATE " . $tableName . " SET ";
            $sets = [];
            $bindings = [];
            foreach ($updateColumn as $uColumn) {
                $setSql = "`" . $uColumn . "` = CASE ";
                foreach ($multipleData as $data) {
                    $setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                    $bindings[] = $data[$referenceColumn];
                    $bindings[] = $data[$uColumn];
                }
                $setSql .= "ELSE `" . $uColumn . "` END ";
                $sets[] = $setSql;
            }
            $updateSql .= implode(', ', $sets);
            $whereIn = collect($multipleData)->pluck($referenceColumn)->values()->all();
            $bindings = array_merge($bindings, $whereIn);
            $whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
            $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
            Log::info($updateSql);
            // 传入预处理sql语句和对应绑定数据
            return DB::update($updateSql, $bindings);
        } catch (\Exception $e) {
            return false;
        }
    }
    

    在service层拼接需要更新的数据,并调用该函数:

     foreach ($taskInfo as $info) {
               $cityId = $info['requirement']['city_ids'];
               //此处省略n行代码
                $cityInfo = ['id' => $dataId[$info['id']]['id'], 'city_id' => $cityId];
                if ($cityInfo) {
                    $cityInfos[] = $cityInfo;
                }
            }
            $res = $this->waybillDriverInfoModel->updateBatch($cityInfos);
     }
    

    拼接的批量更新的数组格式为:
    $students = [
    [‘id’ => 1, ‘city_id’ => ‘100010’],
    [‘id’ => 2, ‘city_id’ => ‘100011’],
    ];

    生成的SQL语句如下:

    UPDATE base_info SET `city_id` = CASE WHEN `id` = 1 THEN 100010 WHEN `id` = 2 THEN 100011 ELSE `city_id` END WHERE `id` IN (1,2)
    

    因为每次只操作20条数据,所以这样拼接的字符串不会太长,符合mysql的字符串长度的要求,解决问题。

    本文参考:https://blog.csdn.net/byywcsnd/article/details/78231429

    展开全文
  • laravel批量更新多条记录

    万次阅读 2017-10-13 23:38:10
    写在前面熟悉laravel的童鞋都知道,laravel批量一次性插入多条记录,却没有一次性按条件更新多条记录。是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法...

    写在前面

    熟悉laravel的童鞋都知道,laravel有批量一次性插入多条记录,却没有一次性按条件更新多条记录。

    是否羡慕thinkphp的saveAll,是否羡慕ci的update_batch,但如此优雅的laravel怎么就没有类似的批量更新的方法呢?

    高手在民间

    Google了一下,发现stackoverflow( https://stackoverflow.com/questions/26133977/laravel-bulk-update )上已经有人写好了,但是并不能防止sql注入。

    本篇文章,结合laravel的Eloquent做了调整,可有效防止sql注入。

    
    <?php
    namespace App\Models;
    
    use DB;
    use Illuminate\Database\Eloquent\Model;
    
    /**
     * 学生表模型
     */
    class Students extends Model
    {
        protected $table = 'students';
    
        //批量更新
        public function updateBatch($multipleData = [])
        {
            try {
                if (empty($multipleData)) {
                    throw new \Exception("数据不能为空");
                }
                $tableName = DB::getTablePrefix() . $this->getTable(); // 表名
                $firstRow  = current($multipleData);
    
                $updateColumn = array_keys($firstRow);
                // 默认以id为条件更新,如果没有ID则以第一个字段为条件
                $referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
                unset($updateColumn[0]);
                // 拼接sql语句
                $updateSql = "UPDATE " . $tableName . " SET ";
                $sets      = [];
                $bindings  = [];
                foreach ($updateColumn as $uColumn) {
                    $setSql = "`" . $uColumn . "` = CASE ";
                    foreach ($multipleData as $data) {
                        $setSql .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                        $bindings[] = $data[$referenceColumn];
                        $bindings[] = $data[$uColumn];
                    }
                    $setSql .= "ELSE `" . $uColumn . "` END ";
                    $sets[] = $setSql;
                }
                $updateSql .= implode(', ', $sets);
                $whereIn   = collect($multipleData)->pluck($referenceColumn)->values()->all();
                $bindings  = array_merge($bindings, $whereIn);
                $whereIn   = rtrim(str_repeat('?,', count($whereIn)), ',');
                $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
                // 传入预处理sql语句和对应绑定数据
                return DB::update($updateSql, $bindings);
            } catch (\Exception $e) {
                return false;
            }
        }
    }
    
    

    可以根据自己的需求再做调整,下面是用法实例:

    // 要批量更新的数组
    $students = [
        ['id' => 1, 'name' => '张三', 'email' => 'zhansan@qq.com'],
        ['id' => 2, 'name' => '李四', 'email' => 'lisi@qq.com'],
    ];
    
    // 批量更新
    app(Students::class)->updateBatch($students);
    
    

    生成的SQL语句如下:

    
    UPDATE pre_students
    SET NAME = CASE
    WHEN id = 1 THEN
    	'张三'
    WHEN id = 2 THEN
    	'李四'
    ELSE
    	NAME
    END,
     email = CASE
    WHEN id = 1 THEN
    	'zhansan@qq.com'
    WHEN id = 2 THEN
    	'lisi@qq.com'
    ELSE
    	email
    END
    WHERE
    	id IN (1, 2)
    	
    

    是不是效率又提高了一大截呢~

    原文 http://www.tech1024.com/original/2950.html

    展开全文
  • Laravel 批量更新多条数据

    千次阅读 2019-03-26 09:06:02
    最近在写任务中,碰到一个问题,需要批量更新多条数据,但是Laravel没有提供这样的方法,Google了一些方法,刚好借着任务来举例说明一下。 任务要求 任务是一个简单的清除未读通知的API,其实就是把通知表中符合user...

    引言
    最近在写任务中,碰到一个问题,需要批量更新多条数据,但是Laravel没有提供这样的方法,Google了一些方法,刚好借着任务来举例说明一下。
    任务要求

    任务是一个简单的清除未读通知的API,其实就是把通知表中符合user_id 和 is_read = 0 的行中的 is_read改为1(0代表未读,1代表已读)。

    1.png

    方法1
    我首先想到的是利用where()方法查出user_id和is_read符合条件的notices,然后利用foreach循环和save()更新数据表。
    $notices = Notice::where(‘user_id’, $userId)
    ->where(‘is_read’, 0)
    ->get(); //得到user_id 和 is_read 符合的notices

    foreach($notices as $notice) {
      $notice->is_read = 1;
      $notice->save();
    }            //更新数据表
    

    这个方法确实可行,可是每次遍历都会和数据库进行通讯,当数据量很大的时候,响应速度就会很慢,也非常的浪费资源。
    方法2
    当我去Google一篇博文启发了我:Laravel一次更新多条记录,批量更新的方法
    其实可以利用一条数据库的SQL语句就搞定这个问题
    UPDATE notices SET is_read = 1 WHERE user_id = 1 AND is_read =0

    一次数据通讯,加快了响应速度又减少资源浪费,那么我可以这样写
    $notices = DB::update(DB::raw(“UPDATE notices SET is_read = 1 WHERE user_id = 1 AND is_read =0”));
    $notices的返回值是更改的数据行数

    我们以后的应用中会有很多种类似的任务,像是忽略一些通知、已读一些消息等等,为了代码的复用,我们可以写一个方法,传入表名、user_id和要修改字段名
    publish function update_batch_one($table, $user_id, $column)
    {
    q = &quot; U P D A T E &quot; . q =&quot;UPDATE&quot;. q="UPDATE".table.SET. c o l u m n . &quot; = 1 W H E R E u s e r i d = &quot; . column.&quot;=1WHEREuser_id=&quot;. column."=1WHEREuserid=".user_id.“AND”.$column."=0";

    return DB::update(DB::raw($q)
    }

    总结归纳
    这两个方法都只能解决一些特定的问题,但是提供了一种思路,有时候用SQL语句可以很方便、简单的操作数据表,如果我们需要根据不同的条件,批量肯定多条数据的多条信息那么就需要用SQL的WHEN THEN方法了,具体思路就是在我上边贴出来的地址里。

    作者:小样面
    链接:https://www.jianshu.com/p/8c5f0cadd933
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 1 Likeword::offset(16854)->chunk(100, function ($word_list) { 2 foreach ($word_list as $word) { 3 $new = str_replace(array("\r\n"), "", $word->likeword); ...
    1         Likeword::offset(16854)->chunk(100, function ($word_list) {
    2             foreach ($word_list as $word) {
    3                 $new = str_replace(array("\r\n"), "", $word->likeword);
    4                 $word->update(['likeword' => $new]);
    5             }
    6         });

     

    转载于:https://www.cnblogs.com/Skrillex/p/10908538.html

    展开全文
  • laravel批量插入或更新

    千次阅读 2019-08-12 23:59:33
    laravel批量插入或更新 在项目中常常有些需求是需要将大量的数据导入库中,如果库中不存在该条数据插入,存在则更新,典型应用场景:更新报表数据,有这些报表的数据归因时间长达28天,也就是28内的数据都会更新...
  • Laravel 根据字段批量更新方法 /** 批量更新 * @param array $multipleData 更新数据 * @param String $field 更新条件 * @param int $num 一次更新几条 * @return bool|int */ public function updateBatch....
  • laravel批量赋值

    2016-10-29 17:53:00
    但事物总是相对的,使用批量赋值是很方便,但同时也带来了安全隐患,很多时候模型类的某些属性值不是我们所期望通过批量赋值修改的,比如用户模型有个user_type属性,如果用户通过请求数据将其类型修改为管理员类型...
  • laravel Eloquent ORM批量更新

    千次阅读 2020-05-28 17:36:09
    批量更新的数据,注意第一个需要是id $data = [ [ 'id' => 1, 'name' => 'test1', 'status' => 1, ], [ 'id' => 2, 'name' => 'test2', 'status' => 1, ], [ 'id'
  • 模型静态方法调用 public static function lowerShelf($ids){ try { foreach($ids as $key => $val){ $products_residential[] = [ 'id'=>$val, ...
  • 主要介绍了Laravel框架学习笔记之批量更新数据功能,结合实例形式分析了Laravel框架批量更新数据的相关模型定义与使用操作技巧,需要的朋友可以参考下
  • laravel批量添加加登陆

    2020-10-18 21:10:01
    laravel批量添加加登陆 1.管理员表设计 创建生成模型和迁移文件 php artisan make:model Models/User -m Schema::create(‘users’, function (Blueprint $table) { $table->bigIncrements(‘id’); $table-&...
  • 首先要对迁移文件进行修改,改成自己需要的字段: 接下来执行 执行完上面命令,数据库中会有一个名为blog_models的表 三、下面开始批量生成数据(注意model路径要对应上): 问题:content为什么是$faker->text?...
  • 场景:两张表,1会员卡主表,2,会员卡商品表,修改会员卡主表如果商品新增或者修改了,需要更新或者新增数据: 使用: 会员卡主表模型多对多关联副表 主表model: //数据表名称 ... * 多对多 批量修改
  • 如果当需要批量修改数据时,如果用循环来一条一条更新的话极大的消耗资源 下面为批量更新方法,建议分组执行 一组10-20条记录同时更新 /** * 批量更新 * @param string $whereColumn 条件字段 最好用id主键 * @...
  • 修改order 表的deal_pice 字段的值,所有小于0的值修改为其相反数。 Order::where('deal_pice','<',0)->update(['deal_pice'=>DB::raw('0- deal_pice ')])
  • <a href="/questions/23315949/laravel-create-or-update-without-two-queries" dir="ltr">Laravel create or update without two queries 6 answers <p>I have a <code>User</code> model and a...
  • laravel 框架中的批量删除

    千次阅读 2019-02-12 15:48:11
    //批量删除按钮 &lt;a style="font-size: 15px;" id="but" onclick="fun()" type="button" class="btn btn-primary"&gt;批量删除&lt;/a&gt; ...
  • laravel-admin 批量操作

    千次阅读 2020-08-31 15:47:08
    目前默认实现了批量删除操作的功能,如果要关掉批量删除操作: $grid->tools(function ($tools) { $tools->batch(function ($batch) { $batch->disableDelete(); }); }); 如果要添加自定义的批量操作,...
  • 在我们实际应用中,免不了这样的情况——例如我们同时录入多条信息,可能三条五条还好说,但量一旦变大,就会增加读写数据库的次数,会降低效率,那么,我们该如何实现,做到一次读写数据库,批量更新呢?...
  • <p>My model structure after model -> find($id); <pre><code> protected 'attributes' => array (size=35) 'id' => string '1234134' (length=6) 'case' => string '123123' (length=... </div>
  • <p>Iam bulk-inserting large database in chunks with this command: <pre><code>DB::table($table)->insert($chunk); </code></pre> ...<p>But want I want is before actual <code>insert</code> operation,...
  • 结合查询语句批量更新 NO.1模型更新 在更新之前我先让你们看一下我的数据库 里面共有四条数据,好,那么我们先使用模型更新,更新我的第四条数据,代码如下: namespace App\Http\Controllers; use App\Student; ...
  • laravel对数据库的表,进行批量的数据添加,修改,删除,可使用seeder进行操作,步骤如下: 一, php artisan make:seeder 名字 二,在上面创建的seeder中写操作代码(增,删,改等) 三,在seeds/DataBaseSeeder...
  • 本文目录一、商品详情api1.1 详情控制器方法1.2 测试效果二、修改商品api2.1 修改商品控制器方法2.2 测试效果三、是否上架api3.1 是否上架控制器方法3.2 测试效果四、是否推荐api4.1 是否推荐api控制器方法4.2 测试...
  • Laravel设置器修改

    千次阅读 2017-08-10 17:44:05
    今天碰到个问题,我在ORM里卖弄运用了修改器,然后Laravel查询出来的数据都变成了修改后的值,我这个结果集还需要放到下一个页面使用,并且还是需要用到修改前的值,如果在此写判断,写switch,那修改器就白瞎了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,216
精华内容 486
关键字:

laravel批量修改