1. 构造器的查询表达式
一. select 查询
select()
方法可以制定你想要的列,而不是所有列;//设置显示的列,设置列别名 $users = DB::table('users')->select('username as name', 'email')->get(); //对象形式 $users = DB::table('users')->select('username as name', 'email')->get()->toArray(); //数组形式
addSelect()
方法,可以在你基础的查询构造器上再增加想要显示的字段;//给已经构建好的查询添加更多字段 $base = DB::table('users')->select('username as name', 'email'); $users = $base->addSelect('gender')->get();
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();
还可以通过
havingRaw()
方法实现更精准的分组筛选;//使用 havingRaw 方法实现分组筛选 $users = DB::table('users')->selectRaw('COUNT(*) AS count, gender') ->groupBy('gender') ->havingRaw('count>5') ->get();
二. where 查询
where()查询,即条件查询,完整形式需要字段表达式和值三个;
//where 查询完整形式 $users = DB::table('users')->where('id', '=', 19)->get();
大部分情况下,是等于用的比较多,就可以省略掉=号参数;
//where 查询完整形式 $users = DB::table('users')->where('id', 19)->get();3.
当然,还有>、<、>=、<=、<>、like 等操作符;
$users = DB::table('users')->where('price', '>=', 95)->get(); $users = DB::table('users')->where('username', 'like', '%小%')->get();
如果条件较多,可以用数组来分别添加条件,具体如下:
//如果条件都是等于,查看 SQL 语句用->toSql()替换->get() $users = DB::table('users')->where([ 'price' => 90, 'gender' => '男' ])->get(); //如果条件非等于 $users = DB::table('users')->where([ ['price', '>=', 90], ['gender', '=', '男'] ])->get();
2. 构造器的where派生查询
一. where派生查询
orWhere()
方法,可以通过连缀实现两个或以上的 or 条件查询;//where() + orWhere 实现 or 条件查询 $users = DB::table('users') ->where('price', '>', 95) ->orWhere('gender', '女') ->toSql(); //结果 select * from `laravel_users` where `price` > ? or `gender` = ?"
通过闭包,我们还可以构建更加复杂的 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 ?)
whereBetween()
可以实现区间查询,比如价格在一个区间内的用户;//whereBetween 查询区间价格 60~90 之间 $users = DB::table('users')->whereBetween('price', [60, 90])->toSql(); //PS:这里还支持相关三种:whereNotBetween/orWhereBetween/orWhereNotBetween;
whereIn()
可以实现数组匹配查询,比如匹配出数组里指定的数据;//whereIn 查询数组里匹配的数值 $users = DB::table('users')->whereIn('id', [20,30,50])->toSql(); //PS:这里还支持相关三种:whereNotIn/orWhereIn/orWhereNotIn;
whereNull()
可以查询字段为 Null 的记录;//whereNull 查询字段值为 Null 的记录 $users = DB::table('users')->whereNull('uid')->toSql(); //PS:这里还支持相关三种:whereNotNull/orWhereNull/orWhereNotNull;
3. 构造器的排序分组 /子查询
一. 排序分组
使用
whereColumn()
方法 实现两个字段相等的查询结果 ;//判断两个相等的字段,同样支持 orWhereColumn() //支持符号'create_time','>', 'update_time' //支持符号支持数组多个字段格式['create_time','>', 'update_time'] $users = DB::table('users') ->whereColumn('create_time', 'update_time') ->get();
使用
orderBy()
方法实现 desc 或 asc 排序功能。//支持 orderByRaw 和 orderByDesc 倒序方法 $users = DB::table('users') ->orderBy('id', 'desc') ->get();
使用
latest()
方法设置时间倒序来排,默认时间字段是 created_at;//按照创建时间倒序排,默认字段 created_at $users = DB::table('users')->latest('create_time')->toSql();
使用
inRandomOrder()
方法来随机排序,得到一个随机列表;//随机排序 $users = DB::table('users')->inRandomOrder()->get();
使用
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();
使用
when()
方法可以设置条件选择,执行相应的 SQL 语句;//when 实现条件选择 $users = DB::table('users')->when(true, function ($query) { $query->where('id', 19); }, function ($query) { $query->where('username', '辉夜'); })->get();
如果 MySQL 在 5.7+,有支持 JSON 数据的新特性;
$users = DB::table('users')->where('list->id', 19)->first();
二. 子查询
使用
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,一般用于子查询的手段,目的是减少开销,提升效率,深入请搜索;
也可以使用
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查询
使用
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();
也可以使用
leftjoin
左连接或rightjoin
右连接实现多表查询;$users = DB::table('users') ->leftJoin('books', 'users.id', '=', 'books.user_id') ->rightjoin('profiles', 'users.id', '=', 'profiles.user_id') ->get();
使用
crossjoin
交叉连接查询,会生成笛卡尔积,再用 distinct()取消重复;$users = DB::table('users') ->crossJoin('books') ->select('username', 'email') ->distinct() ->get();
如果你想要实现闭包查询,和 where 类似,只不过要用 on 和 orOn 方法;
$users = DB::table('users') ->join('books', function ($join) { //支持 orOn 连缀 $join->on('users.id', '=', 'books.user_id'); })->toSql(); //PS:on()方法后面如果想要再增加筛选条件,可以追加 where();
使用
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();
使用
union()
或unionAll()
方法实现两个查询的合并操作;//union 取消重复,unionAll 不取消重复 $query = DB::table('users'); $users = DB::table('users') ->union($query) ->get();
5. 构造器的增删改
一. 增操作
使用
insert()
方法可以新增一条或多条记录;//新增一条记录 DB::table('users')->insert([ 'username' => '李白', 'password' => '123456', 'email' => 'libai@163.com', 'details' => '123' ]); //新增多条记录 (二维数组) DB::table('users')->insert([ [...], [...] ]);
使用
insertOrIgnore()
方法,可以忽略重复插入数据的错误;//忽略重复新增数据的错误 DB::table('users')->insertOrIgnore([ 'id' => 304, 'username' => '李白', 'password' => '123456', 'email' => 'libai@163.com', 'details' => '123' ]);
使用
insertGetId()
方法,获取新增后的自增 ID;//获取新增后返回的 ID $id = DB::table('users')->insertGetId([ 'username' => '李白', 'password' => '123456', 'email' => 'libai@163.com', 'details' => '123' ]); //返回自增id return $id;
二. 改(更新)操作
使用
update()
方法,可以通过条件更新一条数据内容;//更新修改一条数据 DB::table('users') ->where('id', 304) ->update([ 'username' => '李红', 'email' => 'lihong@163.com' ]);
使用
updateOrInsert()
方法,可以先进行查找修改,如不存在,则新增;//参数 1:修改的条件 //参数 2:修改的内容(新增的内容) DB::table('users')->updateOrInsert( ['id'=>307], ['username'=>'李黑', 'password'=>'654321', 'details'=>'123'] );
对于 json 数据,新增和修改的方法和正常数据类似;
//新增时,转换为 json 数据 'list' => json_encode(['id'=>19]) //修改时,使用 list->id 指定 DB::table('users')->where('id', 306) ->update([ 'list->id' => 20 ]);
更新数据时,可以使用自增
increment()
和自减decrement()
方法;//默认自增/自减为 1,可设置 DB::table('users')->where('id', 306)->increment('price'); DB::table('users')->where('id', 306)->increment('price', 2);
三. 删操作
使用
delete()
删除数据,一般来说要加上 where 条件,否则清空;//删除一条数据 DB::table('users')->delete(307); DB::table('users')->where('id', 307)->delete(); //清空 DB::table('users')->delete(); DB::table('users')->truncate();
评论 (0)