我们可以使用多种方式与数据库交互,包括原生sql,查询构造器,以及Eloquent ORm
1、使用 DB 门面进行数据库的增删改查
   DB::insert('insert into users ( id , name , email , password )
       values  ( ?,?,?,?)',[1,'laravel','laravel@test.com','123']);//返回的是bool值 true or false
   DB::select('select * from users where id = ? ',[1]);
   DB::select('select * from users where id = :id ',[':id'=>1]);//返回的是对象数组
   DB::update('update users set name = "laravelAcademy" where name = ?',['Academy'] );//返回受影响的行数
   DB::delete('delete from users where name = ?',['张三']);//返回受影响的行数
   DB::statement('drop table users');//删除用户表
2、监听查询事件
   在AppServiceProvider的boot方法中定义监听器
   function boot(){
        DB::listen(function($sql,$bindings,$time){
           echo 'sql 语句执行:' . $sql . ', 参数' . json_encode($bindings) . ', 耗时:' . $time . 'ms';
       });
   }

3、数据库事务
   DB门面提供两种方式支持数据库事务
   DB::transaction(function(){
        DB::table('users')->update(['id'=>1]);
       DB::table('posts')->delete();
   });
   另外一种是beginTransaction(),rollBack(),commit()三种方法一起使用,从而构建一个完整的事务操作
   DB::beginTransaction();
   if($somethingIsFailed){
         DB::rollBack();
        return false;
   }
   DB::commit();

 使用查询构造器对数据库进行增删改查,还是依赖DB门面
 1、新增数据
   a、insert方法接收一个数组,包含要插入的字段名和值
   DB::table('users')->insert([
      ’name‘  => '李四',
      ’email‘ => '1121323951@qq.com',
      'password' => '123456',
   ])  //返回 boolean 值 true or false
   b、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']
    ]); //返回的是boolean值 true or false
   c、使用insertGetId方法来插入记录并获取Id
   DB::table('users')->insertGetId(['id'=>1,'name'=>'Laravel','email'=>'laravel@test.com','password'=>'123'])
2、更新数据
    update方法接收一个键值对数组,对记录进行更新,返回受影响的行数
    DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);
    递增递减
DB::table('users')->increment('votes');
 DB::table('users')->increment('votes',5);
 DB::table('users')->decrement('vote');
 DB::table('users')->decrement('vote',5);
 DB::table('users')->increment('votes',1,['name'=>'Jone']);
3、删除数据
     DB::table('users')->delete();
     DB::table('users')->where('id','=',54)->delete();//返回受影响的行数
 4、基本查询
     a.获取所有数据列
      DB::table('users')->get();
      DB::table('users')->where('name','=','jone')->get();//返回对象数组
     b、从数据表中获取单个列或行
      $user = DB::tale('users')->where('name','jone')->first();//返回单个对象
      $email = $user->email;
      或者 $email = DB::tale('users')->where('name','jone')->value('email');
     c、分块显示数据
       DB::table('users')->orderBy('id')
            ->chunk(10,function($users as $user){
                   //一些逻辑操作
            });//在闭包中返回false,停止对后续切块的处理
     d、获取一列的值
        $titles = DB::table('roles')->pluck('title');//返回数组
        $titles = DB::table('roles')->pluck('title',‘name’);//返回关联数组
     e、原生表达式
        DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
     f、聚合 count()、max()、min()、avg()、sum()等聚合方法
        DB::table('users')->count();
        DB::table('users')->max('age');
     g、指定一个select语句
        DB::table('users')->select('name','age')->get();
     h、distinct方法允许你强制返回不重复的结果
        DB::table('users')->distinct()->get();
 5、查询构造器高级查询
    a、连接查询
       常见的链接查询有内链接,左连接,右连接,交叉连接
       a1.内链接
         DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();
         a2、左连接
            DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')
         a3、crossJoin交叉连接,交叉连接在第一个表和连接之间生成笛卡儿积
            DB::table('sizes')->crossJoin('colours')->get();
         a4、高级join语句
            DB::table('users')
                 ->join('contacts',function($join){
                      $join->on('users.id','=','contacts.user_id')->orOn(...);
                 })
                 ->get();
            DB::table('users')
                ->join('contacts', function ($join) {
                    $join->on('users.id', '=', 'contacts.user_id')
                         ->where('contacts.user_id', '>', 5);
                })
                ->get();
    b、联合查询
         $users = DB::table('users')->where('id','<',3);
         $users = DB::table('users')->where('id','>',2)->union($users)->get();
         UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,
         另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同
    c、where子句
        1、DB::table('users')->where('列名','操作符',‘比较值’)->get();
        2、也可以传递条件数组
             DB::table('users')->where([
                    ['status', '=', '1'],
                    ['subscribed', '<>', '1'],
                 ])->get();
        3、or语句
           DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();
        4、whereBetween方法用来验证字段的值介于两个值之间
           DB::table('users')
                    ->whereBetween('votes', [1, 100])->get();
        5、whereOrBetween方法验证字段的之不在两值之间
           DB::table('users')
                ->whereNotBetween('votes', [1, 100])
                ->get();
        6、whereIn,whereNotIn方法验证指定字段值在不在数组内
           DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();
           DB::table('users')
                    ->whereNotIn('id', [1, 2, 3])
                    ->get();
        7、whereNull,whereNotNull方法验证字段的值是不是null
           DB::table('users')
                    ->whereNull('updated_at')
                    ->get();
           DB::table('users')
                    ->whereNotNull('updated_at')
                    ->get();
         8、whereDate/whereMonth/whereDay/whereYear/whereTime 方法用于比较字段的值和日期
            $users = DB::table('users')
                ->whereTime('created_at', '=', '11:20')
                ->get();
         9、whereColumn方法用于验证两个字段比较
             DB::table('users')
                ->whereColumn('first_name', 'last_name')
                ->get();
             DB::table('users')
                ->whereColumn('updated_at', '>', 'created_at')
                ->get();
             DB::table('users')
                ->whereColumn([
                    ['first_name', '=', 'last_name'],
                    ['updated_at', '>', 'created_at']
                ])->get();
 6、排序 orderBy 针对指定字段将查找结果进行排序,第一个参数是排序字段,第二个参数是排序顺序asc或desc
       DB::table('users')
                ->orderBy('name', 'desc')
                ->get();
       latest 和 oldest 方法允许你轻松地按日期对查询结果排序
       DB::table('users')
                ->latest()
                ->first();
 7、groupBy/having方法用来对查询结果进行分组
      DB::table('users')
                ->groupBy('first_name', 'status') //对多个字段进行分组
                ->having('account_id', '>', 100)
                ->get();
 8、查询构造器重使用skip和take对查询结果进行分页,相当于limit语句
      $users = DB::table('users')
                    ->skip(10)
                    ->take(5)
                    ->get();
      或者使用limit和offset方法
        DB::table('users')
                ->offset(10)
                ->limit(5)
                ->get();