添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1. 构造器的查询表达式

一. select 查询

    1. select() 方法可以制定你 想要的列 ,而不是所有列;

      //设置显示的列,设置列别名
      $users = DB::table('users')->select('username as name', 'email')->get();    //对象形式
      $users = DB::table('users')->select('username as name', 'email')->get()->toArray();    //数组形式
    2. addSelect() 方法,可以在你基础的查询构造器上再 增加想要显示的字段

      //给已经构建好的查询添加更多字段
      $base = DB::table('users')->select('username as name', 'email');
      $users = $base->addSelect('gender')->get();
    3. DB::raw() 方法可以在 select()内部 实现原生表达式 ,否则解析错误;

      //结合原生 SQL 实现复杂查询
      $users = DB::table('users')->select(DB::raw('COUNT(*) AS id, gender'))
              ->groupBy('gender')
              ->get();

      也可以直接使用 selectRaw() 方法实现内部原生;

      //或者直接使用 selectRaw()方法实现原生
      $users = DB::table('users')->selectRaw('COUNT(*) AS count, gender')
              ->groupBy('gender')
              ->get();
    1. 还可以通过 havingRaw() 方法实现 更精准的分组筛选

      //使用 havingRaw 方法实现分组筛选
      $users = DB::table('users')->selectRaw('COUNT(*) AS count, gender')
              ->groupBy('gender')
              ->havingRaw('count>5')
              ->get();

    二. where 查询

    1. where()查询,即 条件查询 ,完整形式需要字段表达式和值三个;

      //where 查询完整形式
      $users = DB::table('users')->where('id', '=', 19)->get();
    2. 大部分情况下,是等于用的比较多,就可以 省略掉=号参数

      //where 查询完整形式
      $users = DB::table('users')->where('id', 19)->get();3.
    3. 当然,还有 >、<、>=、<=、<>、like 等操作符;

      $users = DB::table('users')->where('price', '>=', 95)->get();
      $users = DB::table('users')->where('username', 'like', '%小%')->get();
    1. 如果 条件较多,可以用数组 来分别添加条件,具体如下:

      //如果条件都是等于,查看 SQL 语句用->toSql()替换->get()
      $users = DB::table('users')->where([
              'price' => 90,
              'gender' => '男'
              ])->get();
      //如果条件非等于
      $users = DB::table('users')->where([
              ['price', '>=', 90],
              ['gender', '=', '男']
          ])->get();

    2. 构造器的where派生查询

    一. where派生查询

    1. orWhere() 方法,可以 通过连缀实现两个或以上的 or 条件 查询;

      //where() + orWhere 实现 or 条件查询
      $users = DB::table('users')
              ->where('price', '>', 95)
              ->orWhere('gender', '女')
              ->toSql();
      select * from `laravel_users` where `price` > ? or `gender` = ?"
    2. 通过 闭包 ,我们还可以 构建更加复杂的 orWhere 查询;

      //orWhere()结合闭包查询
      $users = DB::table('users')
              ->where('price', '>', '95')
              ->orWhere(function ($query) {
                  $query->where('gender', '女')
                  ->where('username', 'like', '%小%');
              })->toSql();
      //select * from `laravel_users` where `price` > ? or (`gender` = ? and `username` like ?)
    1. whereBetween() 可以实现 区间查询 ,比如价格在一个区间内的用户;

      //whereBetween 查询区间价格 60~90 之间
      $users = DB::table('users')->whereBetween('price', [60, 90])->toSql();
      //PS:这里还支持相关三种:whereNotBetween/orWhereBetween/orWhereNotBetween;
    2. whereIn() 可以实现 数组匹配查询 ,比如匹配出数组里指定的数据;

      //whereIn 查询数组里匹配的数值
      $users = DB::table('users')->whereIn('id', [20,30,50])->toSql();
      //PS:这里还支持相关三种:whereNotIn/orWhereIn/orWhereNotIn;
    3. whereNull() 可以 查询字段为 Null 的记录

      //whereNull 查询字段值为 Null 的记录
      $users = DB::table('users')->whereNull('uid')->toSql();
      //PS:这里还支持相关三种:whereNotNull/orWhereNull/orWhereNotNull;

    3. 构造器的排序分组 /子查询

    一. 排序分组

    1. 使用 whereColumn() 方法 实现两个字段相等的查询结果

      //判断两个相等的字段,同样支持 orWhereColumn()
      //支持符号'create_time','>', 'update_time'
      //支持符号支持数组多个字段格式['create_time','>', 'update_time']
      $users = DB::table('users')
              ->whereColumn('create_time', 'update_time')
              ->get();
    2. 使用 orderBy() 方法 实现 desc 或 asc 排序 功能。

      //支持 orderByRaw 和 orderByDesc 倒序方法
      $users = DB::table('users')
              ->orderBy('id', 'desc')
              ->get();
    3. 使用 latest() 方法设置 时间倒序来排 ,默认时间字段是 created_at;

      //按照创建时间倒序排,默认字段 created_at
      $users = DB::table('users')->latest('create_time')->toSql();
    4. 使用 inRandomOrder() 方法来随机排序,得到一个 随机列表

      //随机排序
      $users = DB::table('users')->inRandomOrder()->get();
    5. 使用 skip() take() 限制结果集,或使用 offset() limit()

      take= limit , skip = offset

      //从第 3 条开始,显示 3 条
      $users = DB::table('users')->skip(2)->take(3)->toSql();
      $users = DB::table('users')->offset(2)->limit(3)->get();
    6. 使用 when() 方法可以设置 条件选择 ,执行相应的 SQL 语句;

      //when 实现条件选择
      $users = DB::table('users')->when(true, function ($query) {
                      $query->where('id', 19);
                  }, function ($query) {
                      $query->where('username', '辉夜');
                  })->get();
    7. 如果 MySQL 在 5.7+,有支持 JSON 数据 的新特性;

      $users = DB::table('users')->where('list->id', 19)->first();

    二. 子查询

    1. 使用 whereExists() 方法 实现一个子查询结果 ,返回相应的主查询;

      //通过 books 表数据,查询到 users 表关联的所有用户
      $users = DB::table('users')->whereExists(function ($query) {
                  $query->selectRaw(1)
                        ->from('books')
                        ->whereRaw('laravel_books.user_id = laravel_users.id');
              })->toSql();
      //whereRaw 这句也可以替代为:whereColumn('books.user_id','users.id');
      //PS:select 1 from,一般用于子查询的手段,目的是减少开销,提升效率,深入请搜索;
    1. 也可以使用 where(字段,function())闭包 ,来 实现一个子查询

      //id=子查询返回的 user_id
      $users = DB::table('users')->where('id', function ($query) {
          $query->select('user_id')
                 ->from('books')
                 ->whereColumn('books.user_id','users.id');
      })->toSql();

    4.构造器的 join

    一. join查询

    1. 使用 join 实现内联接的多表查询 ,比如三张表进行 inner join 查询;

      $users = DB::table('users')
                  ->join('books', 'users.id', '=', 'books.user_id')
                  ->join('profiles', 'users.id', '=', 'profiles.user_id')
                  ->select('users.id', 'users.username', 'users.email','books.title', 'profiles.hobby')
                  ->get();
    1. 也可以使用 leftjoin 左连接或 rightjoin 右连接实现 多表查询

      $users = DB::table('users')
                  ->leftJoin('books', 'users.id', '=', 'books.user_id')
                  ->rightjoin('profiles', 'users.id', '=', 'profiles.user_id')
                  ->get();
    2. 使用 crossjoin 交叉连接查询,会生成笛卡尔积 ,再用 distinct()取消重复

      $users = DB::table('users')
              ->crossJoin('books')
              ->select('username', 'email')
              ->distinct()
              ->get();
    3. 如果你想要 实现闭包查询 ,和 where 类似,只不过要用 on 和 orOn 方法;

      $users = DB::table('users')
              ->join('books', function ($join) {
                  //支持 orOn 连缀
                  $join->on('users.id', '=', 'books.user_id');
              })->toSql();
      //PS:on()方法后面如果想要再增加筛选条件,可以追加 where();
    4. 使用 joinSub 实现子连接查询 ,将对应的内容合并在一起输出;

      //子连接查询
      $query = DB::table('books')->selectRaw('user_id,title');
      $users = DB::table('users')->joinSub($query,'books', function ($join) {
             $join->on('users.id', '=', 'books.user_id');
      })->get();
    5. 使用 union() unionAll() 方法 实现两个查询的合并 操作;

      //union 取消重复,unionAll 不取消重复
      $query = DB::table('users');
      $users = DB::table('users')
              ->union($query)
              ->get();

    5. 构造器的增删改

    一. 增操作

    1. 使用 insert() 方法可以 新增一条或多条记录

      //新增一条记录
      DB::table('users')->insert([
          'username' => '李白',
          'password' => '123456',
          'email' => 'libai@163.com',
          'details' => '123'
      //新增多条记录 (二维数组)
      DB::table('users')->insert([
          [...],
          [...]
      ]);
    1. 使用 insertOrIgnore() 方法,可以 忽略重复插入数据的错误

      //忽略重复新增数据的错误
      DB::table('users')->insertOrIgnore([
          'id' => 304,
          'username' => '李白',
          'password' => '123456',
          'email' => 'libai@163.com',
          'details' => '123'
      ]);
    2. 使用 insertGetId() 方法, 获取新增后的自增 ID

      //获取新增后返回的 ID
      $id = DB::table('users')->insertGetId([
          'username' => '李白',
          'password' => '123456',
          'email' => 'libai@163.com',
          'details' => '123'
      //返回自增id
      return $id;

    二. 改(更新)操作

    1. 使用 update() 方法,可以 通过条件更新一条数据 内容;

      //更新修改一条数据
      DB::table('users')
          ->where('id', 304)
          ->update([
              'username' => '李红',
              'email' => 'lihong@163.com'
          ]);
    2. 使用 updateOrInsert() 方法,可以 先进行查找修改,如不存在,则新增

      //参数 1:修改的条件
      //参数 2:修改的内容(新增的内容)
      DB::table('users')->updateOrInsert(
          ['id'=>307],
          ['username'=>'李黑', 'password'=>'654321', 'details'=>'123']
      );
    3. 对于 json 数据 ,新增和修改的方法和正常数据类似;

      //新增时,转换为 json 数据
      'list' => json_encode(['id'=>19])
      //修改时,使用 list->id 指定
      DB::table('users')->where('id', 306)
      ->update([
          'list->id' => 20
      ]);
    4. 更新数据时,可以使用 自增 increment() 自减 decrement() 方法;

      //默认自增/自减为 1,可设置
      DB::table('users')->where('id', 306)->increment('price');
      DB::table('users')->where('id', 306)->increment('price', 2);

    三. 删操作

    1. 使用 delete() 删除数据 ,一般来说要加上 where 条件,否则清空;

      //删除一条数据
      DB::table('users')->delete(307);
      DB::table('users')->where('id', 307)->delete();
      DB::table('users')->delete();
      DB::table('users')->truncate();