查询构建器(Query Builder)
1、新增数据
使用查询构建器的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']
]);
执行成功后即可在数据表$users中插入三条记录。有时候,我们需要插入记录后获取自增ID,可以使用insertGetId方法:
$insertId = DB::table('users')->insertGetId(
['name'=>'Laravel-Academy','email'=>'laravelacademy@test.com','password'=>'456']
);
2、更新数据
更新表记录很简单,使用查询构建器的update方法即可:
$affected = DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);
该方法返回受影响的函数。
3、删除数据
使用delete方法删除表记录,删除方法和更新方法类似,返回被删除的行数:
$deleted = DB::table('users')->where('id', '>', 3)->delete();
如果我们是要删除整个数据表数据,则略去where条件,如果是要清空数据表还要将自增ID置为0,可以使用truncate方法:
DB::table('users')->truncate();
基本查询
4.1 获取所有表记录
使用get方法即可获取一张表的所有记录:
$users = DB::table('users')->get();
dd($users);
如果是获取指定列的数据,则需要加上select条件:
$users = DB::table('users')->select('name','email')->get();
dd($users);
4.2 获取单条记录
获取单条记录需要在查询基础上加上first方法:
$user = DB::table('users')->where('name','Laravel')->first();
dd($user);
4.3 分组块获取数据
如果数据库包含多条数据,则一次性获取会极大影响性能,对应地,我们可以调用chunk方法分组块获取数据:
DB::table('users')->chunk(2,function($users){
foreach($users as $user){
// if($user->name=='LaravelAcademy')
// return false;
echo $user->name.'<br>';
}
});
这里我们指定每次取两条记录。注释部分的意思是我们可以设定查询退出条件,当达到该条件时,查询退出,不再往下执行。
4.4 获取单列的值
上述方法获取的查询结果都是对象实例/对象实例数组,有时候,我们只是想简单获取单列的值,遍历数组获取指定列的值太麻烦,可以使用lists方法获取列值数组:
$users = DB::table('users')->lists('name');
dd($users);
4.5 原生表达式
此外,查询构建器还支持原生表达式,我们需要调用DB门面的raw方法来实现:
$users = DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
dd($users);
1、连接查询(join)
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:
$users = DB::table('users')->join('posts',function($join){
$join->on('users.id','=','posts.user_id')
->where('posts.id','>',1);
})->get();
dd($users);
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);
3、where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:
$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();
4、排序
查询构建器使用orderBy方法对查询结果进行排序:
$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);
5、分组
分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);
我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);
注意:having中的条件字段必须出现在select查询字段中,否则会报错。
6、分页
查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:
$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);
1、新增数据
使用查询构建器的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']
]);
执行成功后即可在数据表$users中插入三条记录。有时候,我们需要插入记录后获取自增ID,可以使用insertGetId方法:
$insertId = DB::table('users')->insertGetId(
['name'=>'Laravel-Academy','email'=>'laravelacademy@test.com','password'=>'456']
);
2、更新数据
更新表记录很简单,使用查询构建器的update方法即可:
$affected = DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);
该方法返回受影响的函数。
3、删除数据
使用delete方法删除表记录,删除方法和更新方法类似,返回被删除的行数:
$deleted = DB::table('users')->where('id', '>', 3)->delete();
如果我们是要删除整个数据表数据,则略去where条件,如果是要清空数据表还要将自增ID置为0,可以使用truncate方法:
DB::table('users')->truncate();
基本查询
4.1 获取所有表记录
使用get方法即可获取一张表的所有记录:
$users = DB::table('users')->get();
dd($users);
如果是获取指定列的数据,则需要加上select条件:
$users = DB::table('users')->select('name','email')->get();
dd($users);
4.2 获取单条记录
获取单条记录需要在查询基础上加上first方法:
$user = DB::table('users')->where('name','Laravel')->first();
dd($user);
4.3 分组块获取数据
如果数据库包含多条数据,则一次性获取会极大影响性能,对应地,我们可以调用chunk方法分组块获取数据:
DB::table('users')->chunk(2,function($users){
foreach($users as $user){
// if($user->name=='LaravelAcademy')
// return false;
echo $user->name.'<br>';
}
});
这里我们指定每次取两条记录。注释部分的意思是我们可以设定查询退出条件,当达到该条件时,查询退出,不再往下执行。
4.4 获取单列的值
上述方法获取的查询结果都是对象实例/对象实例数组,有时候,我们只是想简单获取单列的值,遍历数组获取指定列的值太麻烦,可以使用lists方法获取列值数组:
$users = DB::table('users')->lists('name');
dd($users);
4.5 原生表达式
此外,查询构建器还支持原生表达式,我们需要调用DB门面的raw方法来实现:
$users = DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
dd($users);
1、连接查询(join)
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:
$users = DB::table('users')->join('posts',function($join){
$join->on('users.id','=','posts.user_id')
->where('posts.id','>',1);
})->get();
dd($users);
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);
3、where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:
$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();
4、排序
查询构建器使用orderBy方法对查询结果进行排序:
$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);
5、分组
分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);
我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);
注意:having中的条件字段必须出现在select查询字段中,否则会报错。
6、分页
查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:
$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);