Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查

上一节我们讲了如何使用DB门面对数据库进行原生查询,这一节我们使用另外一种方式实现对数据库的增删改查——查询构建器(Query Builder)。

获取查询构建器很简单,还是要依赖DB门面,我们使用DB门面的table方法,传入表名,即可获取该表的查询构建器:

$users = DB::table('users');

这样我们就获取到了$users表的查询构建器,实际上,底层返回的是Illuminate\Database\Query\Builder的实例,我们对查询构建器的所有操作都是调用该实例对应类上的方法。下面我们就列举查询构建器的一些常用方法,我们还是沿用上一节创建的$users表做演示说明 。

1、新增数据

使用查询构建器的insert方法即可插入一条/多条数据:

DB::table('users')->insert([
    ['id'=>1,'name'=>'Laravel','email'=>'laravel@test.com','password'=>'123'],
    ['id'=>2,'name'=>'Academy','email'=>'academy@test.com','password'=>'123'],
    ['id'=>3,'name'=>'LaravelAcademy','email'=>'laravel-academy@test.com','password'=>'123']
]);

执行成功后即可在数据表$users中插入三条记录。有时候,我们需要插入记录后获取自增ID,可以使用insertGetId方法:

$insertId = DB::table('users')->insertGetId(
    ['name'=>'Laravel-Academy','email'=>'laravelacademy@test.com','password'=>'456']
);

2、更新数据

更新表记录很简单,使用查询构建器的update方法即可:

$affected = DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);

该方法返回受影响的函数。

3、删除数据

使用delete方法删除表记录,删除方法和更新方法类似,返回被删除的行数:

$deleted = DB::table('users')->where('id', '>', 3)->delete();

如果我们是要删除整个数据表数据,则略去where条件,如果是要清空数据表还要将自增ID置为0,可以使用truncate方法:

DB::table('users')->truncate();

4、基本查询

4.1 获取所有表记录

使用get方法即可获取一张表的所有记录:

$users = DB::table('users')->get();
dd($users);

打印结果如下:

查询构建器获取所有结果集

如果是获取指定列的数据,则需要加上select条件:

$users = DB::table('users')->select('name','email')->get();
dd($users);

打印结果如下:

查询构建器获取指定列的结果集

4.2 获取单条记录

获取单条记录需要在查询基础上加上first方法:

$user = DB::table('users')->where('name','Laravel')->first();
dd($user);

则对应结果为:

查询构建器获取单条结果集

4.3 分组块获取数据

如果数据库包含多条数据,则一次性获取会极大影响性能,对应地,我们可以调用chunk方法分组块获取数据:

DB::table('users')->chunk(2,function($users){
    foreach($users as $user){
        // if($user->name=='LaravelAcademy')
            // return false;
        echo $user->name.'<br>';
    }
});

这里我们指定每次取两条记录。注释部分的意思是我们可以设定查询退出条件,当达到该条件时,查询退出,不再往下执行。

4.4 获取单列的值

上述方法获取的查询结果都是对象实例/对象实例数组,有时候,我们只是想简单获取单列的值,遍历数组获取指定列的值太麻烦,可以使用lists方法获取列值数组:

$users = DB::table('users')->lists('name');
dd($users);

对应的输出为:

查询构建器获取单列直

这样我们就可以免去遍历对象数组的麻烦。

4.5 原生表达式

此外,查询构建器还支持原生表达式,我们需要调用DB门面的raw方法来实现:

$users = DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
dd($users);

对应输出为:

原生表达式

如何使用查询构建器实现对数据库的高级查询?比如join、union、添加自定义where条件、排序、分组、分页,请继续阅读下一节:使用查询构建器实现对数据库的高级查询

学院君 has written 698 articles

资深PHP工程师,Laravel学院院长

8 thoughts on “Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查

  1. 波涛 says:

    你好,怎么获取插入的最后一条数据的id?//执行添加 $res=DB::table(‘company’)->insert($data);执行上面的添加操作后,会产生一条数据,请问这条数据的id怎么获取?

    1. 学院君 says:

      查询构建器使用了流接口模式,支持方法链,多个where参数可以使用多个where方法链来实现;
      update/create如果使用批量赋值(Mass Assignment)的话支持数组参数;
      save不支持,但如果使用了批量赋值的话,可以借助fill来实现

  2. 回风哥哥 says:

    DB::table(‘users’)->chunk(2,function($users){
    foreach($users as $user){
    // if($user->name==’LaravelAcademy’)
    // return false;
    echo $user->name.”;
    }
    });

    试了下,会把第三行数据:『LaravelAcademy』也输出,这是为什么?

      1. 刘顺 says:

        如果你在foeach外打印一句话,就会明白了。
        DB::table(‘users’)->orderBy(‘id’)->chunk(1,function($users){
        foreach($users as $user){
        echo $user->name.”;
        }
        echo ‘ddd’;
        });

发表评论

标记为*的字段是必填项(邮箱地址不会被公开)

你可以使用这些HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>