- 排序分组
-
- 使用whereColumn()方法实现两个字段相等的查询结果:
//判断两个相等的字段,同样支持 orWhereColumn()
//支持符号'create_time','>','update_time'
//支持符号支持数组多个字段格式['create_time', '>', 'update_time']
$users = \DB::table('users')->whereColumn('create_time', 'update_time')->get();
b. 使用orderBy()方法实现desc或asc排序功能
//支持 orderByRaw和orderByDesc 倒序方法
$users = \DB::table('users')
->orderBy('id','desc')
->get();
c. 使用 latest()方法设置时间倒序来排,默认时间字段是 created_at:
//按照创建时间倒序排,默认字段 created_at
$users = \DB::table('users')->latest('create_time')->get();
d. 使用 inRandomOrder()方法来随机排序,得到一个随机列表:
//随机排序
$users = \DB::table('users')->inRandomOrder()->get();
e. 使用 skip()和take()限制结果集,或使用offset()和limit()
//从第2条开始,显示2条
$users = \DB::table('users')->skip(1)->take(2)->get();
$users = \DB::table('users')->offset(1)->limit(2)->get();
f. 使用when()方法可以设置条件选择,执行相应的SQL语句:
//when实现条件选择,如果写在开头的判断为true的话执行第一个where,如果为false的话则执行第二个where
query){
$query->where('id',20);
},function($query){
$query->where('id',21);
})->get();
g. 如果MySQL在5.7+,有支持JSON数据的新特性;
$users = \DB::table('users')->where('list->id', 19)->get();
- 子查询
a. 使用whereExists()方法实现一个子查询结果,返回响应的主查询:
//通过books 表数据,查询到users 表关联的用户
query) {
$query->selectRaw(1) //这一段本可以不用添加,select 1 from,一般用于子查询的手段,目标是减少开销,提升效率,深入请搜索;
->from('books')
->whereColumn('books.user_id','users.id');
})->get();
b. 也可以使用where(字段,function())闭包,来实现一个子查询:
//id=子查询返回的user=id
query) {
$query->select('user_id')
->from('books')
->whereColumn('books.user_id','users.id');
})->get();
- join查询
-
- 使用join实现内联接的多表查询,比如三张表进行inner join查询:
// 这个输出的东西会将各个表里面不同的东西放到一个表里,同样的东西直接合并,输出的表必须是这里面3张表都找的到对应值
$users = \DB::table('users')
->join('books', 'books.user_id', '=', "users.id")
->join('profiles', "profiles.user_id",'=','users.id')
->get();
b. 也可以使用leftjoin 左连接和rightjoin右连接实现多表查询:
//leftJoin就是将右边能对上号的值拿到左边来,rightJoin就是将左边能对上号的值拿到右边去
$users = \DB::table(users')
->leftJoin('books','books.user_id','=','users.id')
->rightJoin('profiles','profiles.user_id','=','users.id')
->get();
c. 使用crossjoin交叉连接查询,会生成笛卡尔积,再用distinct()取消重复:
//crossjoin()会将传入的列表中的所有每列数据分别插入至主要的表里的每列中输出,可以用select()限制输出内容,也可以用distinct()消除重复
$users = \DB::table('users')
->select('username','title','email')
->crossJoin('books')
->distinct()
->get();
d. 如果你想要实现闭包查询,和where类似,只不过要用on和orOn方法:
join){
$join->on('books.user_id', '=', 'users.id')->where('users.id', 20);
})->get();
e. 使用joinSub 实现子连接查询,将对应的内容合并在一起输出:
//子连接查询
$query = \DB::table('books')->selectRaw('user_id, title');
query, 'books', function($join){
$join->on('books.user_id', '=', 'users.id');
})->get();
f. 使用union()或unionAll()方法实现两个查询的合并操作:
//union取消重复,unionAll不取消重复,这里面的合并是指把合并进去的数据放在上一个表的后面,而不是塞到同一个列里面
$query = \DB::table('users');
query)->get();
$query = \DB::table('users');
query)->get();