我们可以使用多种方式与数据库交互,包括原生sql,查询构造器,以及Eloquent ORm
1、使用 DB 门面进行数据库的增删改查
DB::insert('insert into users ( id , name , email , password )
values ( ?,?,?,?)',[1,'laravel','laravel@test.com','123']);//返回的是bool值 true or false
DB::select('select * from users where id = ? ',[1]);
DB::select('select * from users where id = :id ',[':id'=>1]);//返回的是对象数组
DB::update('update users set name = "laravelAcademy" where name = ?',['Academy'] );//返回受影响的行数
DB::delete('delete from users where name = ?',['张三']);//返回受影响的行数
DB::statement('drop table users');//删除用户表
2、监听查询事件
在AppServiceProvider的boot方法中定义监听器
function boot(){
DB::listen(function($sql,$bindings,$time){
echo 'sql 语句执行:' . $sql . ', 参数' . json_encode($bindings) . ', 耗时:' . $time . 'ms';
});
}
3、数据库事务
DB门面提供两种方式支持数据库事务
DB::transaction(function(){
DB::table('users')->update(['id'=>1]);
DB::table('posts')->delete();
});
另外一种是beginTransaction(),rollBack(),commit()三种方法一起使用,从而构建一个完整的事务操作
DB::beginTransaction();
if($somethingIsFailed){
DB::rollBack();
return false;
}
DB::commit();
使用查询构造器对数据库进行增删改查,还是依赖DB门面
1、新增数据
a、insert方法接收一个数组,包含要插入的字段名和值
DB::table('users')->insert([
’name‘ => '李四',
’email‘ => '1121323951@qq.com',
'password' => '123456',
]) //返回 boolean 值 true or false
b、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']
]); //返回的是boolean值 true or false
c、使用insertGetId方法来插入记录并获取Id
DB::table('users')->insertGetId(['id'=>1,'name'=>'Laravel','email'=>'laravel@test.com','password'=>'123'])
2、更新数据
update方法接收一个键值对数组,对记录进行更新,返回受影响的行数
DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);
递增递减
DB::table('users')->increment('votes');
DB::table('users')->increment('votes',5);
DB::table('users')->decrement('vote');
DB::table('users')->decrement('vote',5);
DB::table('users')->increment('votes',1,['name'=>'Jone']);
3、删除数据
DB::table('users')->delete();
DB::table('users')->where('id','=',54)->delete();//返回受影响的行数
4、基本查询
a.获取所有数据列
DB::table('users')->get();
DB::table('users')->where('name','=','jone')->get();//返回对象数组
b、从数据表中获取单个列或行
$user = DB::tale('users')->where('name','jone')->first();//返回单个对象
$email = $user->email;
或者 $email = DB::tale('users')->where('name','jone')->value('email');
c、分块显示数据
DB::table('users')->orderBy('id')
->chunk(10,function($users as $user){
//一些逻辑操作
});//在闭包中返回false,停止对后续切块的处理
d、获取一列的值
$titles = DB::table('roles')->pluck('title');//返回数组
$titles = DB::table('roles')->pluck('title',‘name’);//返回关联数组
e、原生表达式
DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
f、聚合 count()、max()、min()、avg()、sum()等聚合方法
DB::table('users')->count();
DB::table('users')->max('age');
g、指定一个select语句
DB::table('users')->select('name','age')->get();
h、distinct方法允许你强制返回不重复的结果
DB::table('users')->distinct()->get();
5、查询构造器高级查询
a、连接查询
常见的链接查询有内链接,左连接,右连接,交叉连接
a1.内链接
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
a2、左连接
DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')
a3、crossJoin交叉连接,交叉连接在第一个表和连接之间生成笛卡儿积
DB::table('sizes')->crossJoin('colours')->get();
a4、高级join语句
DB::table('users')
->join('contacts',function($join){
$join->on('users.id','=','contacts.user_id')->orOn(...);
})
->get();
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
b、联合查询
$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,
另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同
c、where子句
1、DB::table('users')->where('列名','操作符',‘比较值’)->get();
2、也可以传递条件数组
DB::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();
3、or语句
DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
4、whereBetween方法用来验证字段的值介于两个值之间
DB::table('users')
->whereBetween('votes', [1, 100])->get();
5、whereOrBetween方法验证字段的之不在两值之间
DB::table('users')
->whereNotBetween('votes', [1, 100])
->get();
6、whereIn,whereNotIn方法验证指定字段值在不在数组内
DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();
7、whereNull,whereNotNull方法验证字段的值是不是null
DB::table('users')
->whereNull('updated_at')
->get();
DB::table('users')
->whereNotNull('updated_at')
->get();
8、whereDate/whereMonth/whereDay/whereYear/whereTime 方法用于比较字段的值和日期
$users = DB::table('users')
->whereTime('created_at', '=', '11:20')
->get();
9、whereColumn方法用于验证两个字段比较
DB::table('users')
->whereColumn('first_name', 'last_name')
->get();
DB::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
DB::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at']
])->get();
6、排序 orderBy 针对指定字段将查找结果进行排序,第一个参数是排序字段,第二个参数是排序顺序asc或desc
DB::table('users')
->orderBy('name', 'desc')
->get();
latest 和 oldest 方法允许你轻松地按日期对查询结果排序
DB::table('users')
->latest()
->first();
7、groupBy/having方法用来对查询结果进行分组
DB::table('users')
->groupBy('first_name', 'status') //对多个字段进行分组
->having('account_id', '>', 100)
->get();
8、查询构造器重使用skip和take对查询结果进行分页,相当于limit语句
$users = DB::table('users')
->skip(10)
->take(5)
->get();
或者使用limit和offset方法
DB::table('users')
->offset(10)
->limit(5)
->get();