精华内容
下载资源
问答
  • 文章前导在使用 Laravel 框架时发现框架的模型无法支持批量创建数据和批量修改数据。于是乎就自己封装了一个批量添加和批量修改数据的方法。只需要封装一个基础模型,让该基础模型 exte...

    文章前导

    在使用 Laravel 框架时发现框架的模型无法支持批量创建数据和批量修改数据。于是乎就自己封装了一个批量添加和批量修改数据的方法。只需要封装一个基础模型,让该基础模型 extend Model(框架自带的模型),其他的模型继承你的基础模型即可,全局调用。

    示例演示

    函数封装

    use Illuminate\Database\Eloquent\Model;
    
    class BaseModel extends Model
    {
        public $timestamps = true;
    
        protected $dateFormat = 'U';
    
        CONST CREATED_AT = 'create_time';
    
        CONST UPDATED_AT = 'update_time';
        
        /**
         * 批量添加
         * @param string $tableName 数据表名
         * @param array $info 插入的数据
         * @return bool
         * @author kert
         */
        public function batchInsert(string $tableName, array $info): bool
        {
            $timeArray = [
                'create_time' => time(),
                'update_time' => time(),
            ];
            array_walk($info, function (&$value, $key, $timeArray) {
                $value = array_merge($value, $timeArray);
            }, $timeArray);
            return DB::table($tableName)->insert($info);
        }
        
        /**
         * 批量更新
         * @param string $tableName 数据表名
         * @param array $info 更新的数据
         * @return int 受影响的行数
         * @author kert
         */
        public function batchUpdate(string $tableName, array $info)
        {
            try {
                if (count($info) > 0) {
                    $firstRow        = current($info);
                    $updateColumn    = array_keys($firstRow);
                    $referenceColumn = isset($firstRow['id']) ? 'id' : current($updateColumn);
                    unset($updateColumn[0]);
                    $updateSql = "UPDATE " . $tableName . " SET ";
                    $sets      = [];
                    $bindings  = [];
                    foreach ($updateColumn as $uColumn) {
                        $setSql = "`" . $uColumn . "` = CASE ";
                        foreach ($info as $data) {
                            $setSql     .= "WHEN `" . $referenceColumn . "` = ? THEN ? ";
                            $bindings[] = $data[$referenceColumn];
                            $bindings[] = $data[$uColumn];
                        }
                        $setSql .= "ELSE `" . $uColumn . "` END ";
                        $sets[] = $setSql;
                    }
                    $updateSql .= implode(', ', $sets);
                    $whereIn   = collect($info)->pluck($referenceColumn)->values()->all();
                    $bindings  = array_merge($bindings, $whereIn);
                    $whereIn   = rtrim(str_repeat('?,', count($whereIn)), ',');
                    $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $referenceColumn . "` IN (" . $whereIn . ")";
                    return DB::update($updateSql, $bindings);
                }
                return 0;
            } catch (\Exception $e) {
                return $e->getMessage();
            }
        }
      }
    

    函数调用

    use BaseModel;
    
    clasee User extends BaseModel
    {
      protected $table = 'user';
      
      public function insert(arry $info):bool
      {
         return $this->batchInsert((string)$this->getTable(), (array)$info);
      }
      
      public function update(array $info):bool
      {
        return $this->batchUpdate((string)$this->getTable(), (array)$info);
      }
    }
    

    数据格式

    // 批量添加数据格式
    $addData = [
      ['name' => '张三', 'age' => 12, 'sex' => '男'],
      ['name' => '张三', 'age' => 12, 'sex' => '男'],
      ['name' => '张三', 'age' => 12, 'sex' => '男'],
      ['name' => '张三', 'age' => 12, 'sex' => '男'],
    ];
    // 批量更新数据格式
    $updateData = [
      ['id' => 1, name' => '张三', 'age' => 12, 'sex' => '男'],
      ['id' => 2, 'name' => '张三', 'age' => 12, 'sex' => '男'],
      ['id' => 3, 'name' => '张三', 'age' => 12, 'sex' => '男'],
      ['id' => 4, 'name' => '张三', 'age' => 12, 'sex' => '男'],
    ];
    
    展开全文
  • 如果当需要批量修改数据时,如果用循环来一条一条更新的话极大的消耗资源 下面为批量更新方法,建议分组执行 一组10-20条记录同时更新 /** * 批量更新 * @param string $whereColumn 条件字段 最好用id主键 * @...

    laravle按不同条件批量更新不同数据记录一下

    laravel中DB类中支持批量插入但是没有批量更新语句
    如果当需要批量修改数据时,如果用循环来一条一条更新的话极大的消耗资源
    下面为批量更新方法,建议分组执行 一组10-20条记录同时更新

    /**
         * 批量更新
         * @param string $whereColumn 条件字段 最好用id主键
         * @param array $rows 批量修改的数据 每一行中必须包含条件列与值 例如 $rows = [['id'=>1,'image'=>'xxx','name'=>'xxx'],['id'=>2,'image'=>'xxx','name'=>'xxx','info'=>'xxxx'],['id'=>3,'其他列1'=>'xxx','其他列2'=>'xxx','其他列3'=>'xxxx']] 每行可修改不同数据
         * @return false|int 成功返回影响行数 失败返回false
         * @throws \Exception
         */
        public function updateBatch(string $whereColumn = 'id', array $rows = [])
        {
            if (empty($rows)) {
                throw new StatusTagException("data_notfound");
            }
            $tableName = DB::getTablePrefix() . $this->getTable(); // 表名
    
    
            // 取出所有需要更新的列
            $updateColumn = [];
            foreach ($rows as $row){
                $updateColumn = array_merge($updateColumn,array_keys($row));
            }
            // 去重复
            $updateColumn = array_unique($updateColumn);
    
    
            // 拼接sql语句
            $updateSql = "UPDATE " . $tableName . " SET ";
            $sets  = [];
            $bindings = [];
            $isExists = false;
            foreach ($updateColumn as $uColumn) {
                // 当前列 不等于条件列
                if($uColumn!==$whereColumn){
                    $setSql = "`" . $uColumn . "` = CASE ";
                    // 记录当前列 在所有行中是否存在
                    $isExists = false;
                    foreach ($rows as $row) {
                        // 判断是否存在 条件列
                        if(!isset($row[$whereColumn]) or is_null($row[$whereColumn]) or is_array($row[$whereColumn]) or is_object($row[$whereColumn])){
                            throw new \Exception('缺少条件');
                        }
    
                        // 判断当前数据组 是否存在该修改的列 存在则添加修改 不存在不添加
                        if(isset($row[$uColumn])){
    
                            // 判断数据格式
                            if(is_array($row[$uColumn])){
                                $row[$uColumn] = json_encode($row[$uColumn]);
                            }else if(is_object($row[$uColumn])){
                                throw new \Exception('格式错误');
                            }
    
                            $setSql .= "WHEN `" . $whereColumn . "` = ? THEN ? ";
                            // 条件列
                            $bindings[] = $row[$whereColumn];
                            // 修改的列 值
                            $bindings[] = $row[$uColumn];
                            // 在行中存在
                            $isExists = true;
                        }
                    }
                    // 当前列在所有行中不存在 抛出异常
                    if(!$isExists){
                        throw new \Exception('数据不存在');
                    }
                    $setSql .= "ELSE `" . $uColumn . "` END ";
                    $sets[] = $setSql;
                }
            }
            $updateSql .= implode(', ', $sets);
            $whereIn = collect($rows)->pluck($whereColumn)->values()->all();
            $bindings = array_merge($bindings, $whereIn);
            $whereIn = rtrim(str_repeat('?,', count($whereIn)), ',');
            $updateSql = rtrim($updateSql, ", ") . " WHERE `" . $whereColumn . "` IN (" . $whereIn . ")";
            //dump([$updateSql,$bindings,$whereIn]);
            //throw new StatusTagException('missing_data');
            // 传入预处理sql语句和对应绑定数据
            return DB::update($updateSql, $bindings);
    
        }
    

    使用示例

    $updateSkus = [['id'=>1,'image'=>'xxx','price'=>'xxx'],['id'=>2,'image'=>'xxx','price'=>'xxx','info'=>'xxxx'],['id'=>3,'其他列1'=>'xxx','其他列2'=>'xxx','其他列3'=>'xxxx']]
                if (!empty($updateSkus)) {
                    // 分组更新 每组最大20条
                    $max = 20;
                    $endKey = count($updateSkus) -1;
                    $lsSkus = [];
                    foreach ($updateSkus as $k=>$sku){
                        $lsSkus[] = $sku;
                        if(count($lsSkus) === $max or $k === $endKey){
                            $num = (new GoodsSku())->updateBatch('id',$lsSkus);
                            if (empty($num) or $num !== count($lsSkus)) {
                            	// 抛出异常 执行回滚
                                throw new \Exception('更新失败');
                            }
                            $lsSkus = [];
                        }
                    }
                
    
    展开全文
  • 本文实例讲述了Laravel框架Eloquent ORM修改数据操作。分享给大家供大家参考,具体如下: 这篇文章主要讲述两个知识点 通过模型更新 结合查询语句批量更新 NO.1模型更新 在更新之前我先让你们看一下我的数据库 ...
  • 结合查询语句批量更新 NO.1模型更新 在更新之前我先让你们看一下我的数据库 里面共有四条数据,好,那么我们先使用模型更新,更新我的第四条数据,代码如下: namespace App\Http\Controllers; use App\Student; ...

    这篇文章主要讲述两个知识点

    1. 通过模型更新
    2. 结合查询语句批量更新

    NO.1模型更新

    在更新之前我先让你们看一下我的数据库
    在这里插入图片描述
    里面共有四条数据,好,那么我们先使用模型更新,更新我的第四条数据,代码如下:

    namespace App\Http\Controllers;
    
    use App\Student;
    
    use Illuminate\Support\Facades\DB;
    
    class StudentController extends Controller
    {
    	public function orm3()
    	{
    		$student = Student::find(4);
            $student->name = 'ShenNanQiao';//修改值
            $student->save();//保存
    	}
    }
    
    

    输出结果如下:
    在这里插入图片描述
    成功修改了四号的name值

    NO.2批量修改

    在上面那个图里,我觉得那几个名字的人都很老,那么我们要让他们都变成16岁,该怎么做呢?
    代码如下:

    namespace App\Http\Controllers;
    
    use App\Student;
    
    use Illuminate\Support\Facades\DB;
    
    class StudentController extends Controller
    {
    	public function orm3()
    	{
    		$num = Student::where('id','>=',1)
    		->update(
    			['age' =>16]
    		);
    	}
    }
    

    结果如下:
    在这里插入图片描述
    你看,是不是都变成16岁了,哈哈哈

    展开全文
  • //关闭批量操作 $grid->tools(function ($tools) { $tools->batch(function ($batch) { $batch->disableDelete(); }); }); $form //表单bottom $form->disableReset(); $form->disableEditingCheck(); $form->...
    $grid->actions(function ($actions) {
        // 去掉查看
        $actions->disableView();
    });
    
    
    //去掉复选框
    $grid->disableRowSelector();
    //禁用行操作
    $grid->disableActions();
    //禁用单选框
    $grid->disableRowSelector();
    //禁用新增按钮
    $grid->disableCreation();
    
    $grid->actions(function ($actions) {    
    	//关闭行操作 删除    
    	$actions->disableDelete();
    });
    //关闭批量操作
    $grid->tools(function ($tools) {    
    	$tools->batch(function ($batch) {        
    	    $batch->disableDelete();    
    	});
    });
    
    
    $form
    //表单bottom
    $form->disableReset();
    $form->disableEditingCheck();
    $form->disableViewCheck();
    
    //表单右上角
    $form->tools(function (Form\Tools $tools) {
    	$tools->disableDelete();
    	$tools->disableView();
    });
    
    
    $grid
    // 表单右上角
    $grid->disableExport();
    $grid->disableCreation();
    //操作按钮
    $grid->actions(function (Grid\Displayers\Actions $actions) {
    	$actions->disableDelete();
    	$actions->disableEdit();
    	$resDemand = Demand::find($actions->getKey());
    	$edit_html='';
    	//通过
    	if($resDemand->status==1){
    		$edit_html.="<span class='mb-5'><a class='grid-row-pass' title='审核' data-id='{$actions->getKey()}'><i class='glyphicon glyphicon-ok'></i></a></span>";
        }
    	$actions->append($edit_html);
    });
    
    
    //批量操作
    $grid->tools(function (Grid\Tools $tools) {
    	$tools->batch(function (Grid\Tools\BatchActions $actions) {
    		$actions->disableDelete();
    	});
    });
    
    
    $show
    //表单右上角
    $show->panel()->tools(function ($tools){
    	$tools->disableDelete();
    	$tools->disableEdit();
    });
    
    //可以通过传入的$actions参数来获取当前行的数据:
    $grid->actions(function ($actions) {
        
        // 当前行的数据数组
        $actions->row;
        
        // 获取当前行主键值
        $actions->getKey();
    });
    
    如果有自定义的操作按钮,可以通过下面的方式添加
    $grid->actions(function ($actions) {
        
        // append一个操作
        $actions->append('<a href=""><i class="fa fa-eye"></i></a>');
    
        // prepend一个操作
        $actions->prepend('<a href=""><i class="fa fa-paper-plane"></i></a>');
    }
    
    如果有比较复杂的操作,可以参考下面的方式:
    先定义操作类
    namespace App\Admin\Extensions;
    
    use Encore\Admin\Admin;
    
    class CheckRow
    {
        protected $id;
    
        public function __construct($id)
        {
            $this->id = $id;
        }
    
        protected function script()
        {
            return <<<SCRIPT
    
    $('.grid-check-row').on('click', function () {
        
        // Your code.
        console.log($(this).data('id'));
        
    });
    
    SCRIPT;
        }
    
        protected function render()
        {
            Admin::script($this->script());
    
            return "<a class='btn btn-xs btn-success fa fa-check grid-check-row' data-id='{$this->id}'></a>";
        }
        
        public function __toString()
        {
            return $this->render();
        }
    }
    
    然后添加操作:
    
    $grid->actions(function ($actions) {
        
        // 添加操作
        $actions->append(new CheckRow($actions->getKey()));
    });

     

    展开全文
  • 修改order 表的deal_pice 字段的值,所有小于0的值修改为其相反数。 Order::where('deal_pice','<',0)->update(['deal_pice'=>DB::raw('0- deal_pice ')])
  • laravel对数据库的表,进行批量的数据添加,修改,删除,可使用seeder进行操作,步骤如下: 一, php artisan make:seeder 名字 二,在上面创建的seeder中写操作代码(增,删,改等) 三,在seeds/DataBaseSeeder...
  • Laravel 笔记

    2018-04-26 14:24:27
    PHPSTORM ctrl+d 复制光标所在行 shift+f6 批量修改变量 Composer 安装 pkg.phpcomposer.com 路由 路由参数 Route::get(‘Member/Edit/{id}’, ‘MemberController@edit’)-&gt;name(‘...
  • 在上一篇教程中,我们基于 Eloquent 模型实现了对数据表记录的增删...在介绍批量赋值之前,我们先看一个例子,之前我们新增或者修改 Eloquent 模型时都是通过依次设置每个属性来实现的:$post=newApp\Post;$post-&g...
  • Laravel DataTables编辑器插件。 该软件包是的插件,用于处理库。 特别感谢和提供了支持该软件包开发的许可证。 注意:需要才能使用库。 要求 文件资料 产品特点 支持DataTables编辑器CRUD操作。 内联编辑。 ...
  • Laravel 数据库操作

    千次阅读 2019-08-01 15:08:35
    本篇概要:1. DB facade(原始查找);1.1 新建数据表与连接数据库;1.2 使用 DB facade 实现 CURD;2. 查询构造器;2.1 简介及新增数据;...3.2 新增数据、自定义时间戳及批量赋值的使用;3.3 修改数据;3.4...
  • Laravel Eloquent ORM 是 Laravel 中最强大的部分,也是 Laravel 能如此流行最重要的原因。中文文档在:http://laravel-china.org/docs/5.1/eloquent</p> <p><code>learnlaravel5/app/Article....
  • 让我们修改前台的视图文件,想办法把评论功能加进去。</p> <h4>创建前台的 ArticleController 类</h4> <p>运行命令:</p> <pre><code> bash ...
  • Eloquent ORM中新增数据、自定义时间戳及批量赋值的使用 使用Eloquent ORM修改数据 使用Eloquent ORM删除数据 1. Eloquent ORM简介、模型的建立及查询数据 Eloquent ORM简介 Laravel所自带的Eloquent ORM是一个优美...
  • laravel 练习(学生表)

    2017-10-26 16:22:00
    页面 页面对数据库的查询处理,不一定是一 一对应的,页面的显示效果而言,不是看数据表提供能什么,而是根据页面需要什么,再使用方法去数据库里面...问题:单个删除可执行的情况下,加入批量删除,导致如下现象:...
  • 不仅如此,在线上部署的时候,也避免了手动导入数据库或手动修改数据结构的麻烦,数据迁移帮你方便的维护着数据结构。 数据填充,让我们测试的时候需要大量的假数据不再一条一条的去造数据,可以轻松的批量填充大量...
  • //如果不是用 0 表示未删除, 可以修改 MultipleSelect 的 setCustomWhere 方法中的下面这段中的 0 if (logic != null) sb.append(" AND ") .append(te.getNickName()) .append(".") .append(logic) .append...
  • 13.3 关联修改 13.4 多对多关联的增删改 13.1 关联新增 1、比如有一个功能:给一个用户增加关联的书籍。则方法如下。 首先观察book表,没有时间字段,需要取消自动写入时间。同时,也要为book表设置取消批量赋值:
  • 但是在新增前,需要先在模型类里设定好 fillable 或 guarded 属性,因为 Eloquent 默认会防止批量赋值 例如 protected $fillable = ['name']; protected $guarded = ['price']; 定义了name 字段可以写入/修改...
  • ajax批量删除

    2020-10-24 21:05:59
    auth.php修改配置 2.模型层使用配置好的auth 3.auth的基本使用方法: 3.1 auth->attempt() 实现登录 两个参数(username,password)密码必须是bcrypt加密 3.2 auth->check() 检测是否登录 3.3 auth->...
  • 测试环境:laravel5.8 基于Maatwebsite\Excel 导出excel表格 通过控制器直接导出测试注意事项: 需要考虑执行php配置的响应时间 可占用内存上限制 经过测试:最大执行时间默认30会操作超时 最大可用内存512时,会报...
  • 这里是用的laravel框架 首先是前台模板: Document 测试页面 选择 ID 内容 删除 修改 @foreach($res as $v) {{$v['id']}}
  • Node多国语言包

    2016-05-07 15:11:00
    Via:https://github.com/caouecs/Laravel-lang 1、下载:... 2、因为下载的包为PHP后缀,用DOS命令批量修改为 json for /r . %a in (*.php) do rename%a*.json 3、 转载于:...
  • 批量修改接口标签 二级和二级分类的概念 复仇者联盟 大众化的全球定位 Four les utilisateurs finaux: 本地化(rechercheàx km d'une adresse) 点菜式 附属机构动态 系统要求 PHP 5.6以上 MySQL的 Laravel的...
  • php传输数据缺失问题

    2021-01-30 10:53:21
    记录开发中遇到的一个问题,在做需求是同事在要修改的部分从每行修改改为批量修。.因为公司用的框架是laravel,不像tp5,一个saveAll完美解决。 我在这里用了一个笨方法--循环,传输修改后的数组然后根据数组进行...
  • 完整的购物流程,商品的加入、编辑、删除、批量选择,收货地址的选择,下单支付 会员中心(订单、收藏、足迹、收货地址、意见反馈) 营销优惠系统 支付功能 .... 小程序前端项目结构 跟目录下的 applet文件夹下 ...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

laravel批量修改