- 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方法:
$users = \DB::table(‘users’)->join(‘books’, function($join){
$join->on(‘books.user_id’, ‘=’, ‘users.id’)->where(‘users.id’, 20);
})->get();
e. 使用joinSub 实现子连接查询,将对应的内容合并在一起输出:
//子连接查询
$query = \DB::table(‘books’)->selectRaw(‘user_id, title’);
$users = \DB::table(‘users’)->joinSub($query, ‘books’, function($join){
$join->on(‘books.user_id’, ‘=’, ‘users.id’);
})->get();
f. 使用union()或unionAll()方法实现两个查询的合并操作:
//union取消重复,unionAll不取消重复,这里面的合并是指把合并进去的数据放在上一个表的后面,而不是塞到同一个列里面
$query = \DB::table(‘users’);
$users = \DB::table(‘users’)->union($query)->get();
$query = \DB::table(‘users’);
$users = \DB::table(‘users’)->unionAll($query)->get();