Laravel支持多种数据库,包括MySQL、Postgres、SQLite和SQL Server,在Laravel中连接数据库和查询数据库都非常简单,我们可以使用多种方式与数据库进行交互,包括原生SQL语句、查询构建器以及Eloquent ORM。本节我们先演示如何使用原生SQL在Laravel应用中对数据库进行增删改查。
使用DB门面进行增删改查
1 插入数据
我们使用DB门面执行原生SQL语句,插入操作使用DB门面的insert
方法,代码如下:
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppHttpRequests; use AppHttpControllersController; use DB; class TestController extends Controller { /** * Display a listing of the resource. * * @return Response */ public function index() { DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )', [1, 'Laravel','laravel@test.com','123']); DB::insert('insert into users (id, name, email, password) values (?, ?, ?, ? )', [2, 'Academy','academy@test.com','123']); } }
2 查询语句
查询操作使用DB门面的select
方法,代码如下:
$user = DB::select('select * from users where id = ?', [1]); dd($user);
我们还 可以看到在执行查询的时候使用了参数绑定,以避免SQL注入。除此之外还可以使用命名绑定:
$user = DB::select('select * from users where id = :id', [':id'=>1]);
效果一样。
3 更新语句
更新表记录可以使用DB门面的update
方法,该方法返回受影响的行数:
$affected = DB::update('update users set name="LaravelAcademy" where name = ?', ['Academy']);
echo $affected;
更新多少返回多少,如果没有更新任何记录则返回0。
4 删除语句
删除表记录使用DB门面的delete
方法,和update
类似,该方法返回被删除的行数:
$deleted = DB::delete('delete from users'); echo $deleted;
表数据都被我们删除了(删除要带条件,不然...)
5 通用语句
除了上述这些DML(insert/update/delete)和DQL(select)语句,SQL语句还包括DCL(create/drop等)和DDL(grant等),要运行后者,我们可以调用DB门面的statement
方法:
DB::statement('drop table users');
执行完该语句后,数据表users会被删除。
4、监听查询事件
除此之外,我们还可以通过DB门面的listen
方法监听查询事件,比如我们在记录日志和调试的时候这会给我们确定问题提供便利,可以在服务提供者的boot
方法中注册该监听器,例如我们在AppServiceProvider
的boot
方法中定义监听器如下:
/** * 启动所有应用服务 * * @return void */ public function boot() { DB::listen(function($sql, $bindings, $time) { echo 'SQL语句执行:'.$sql.',参数:'.json_encode($bindings).',耗时:'.$time.'ms'; }); }
这样我们运行如下SQL语句:
DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )',
[3, 'LaravelAcademy','laravel-academy@test.com','123']);
则浏览器会输出如下内容:
SQL语句执行:insert into users (id, name, email, password) values (?, ?, ? , ? ),参数:[3,"LaravelAcademy","laravel-academy@test.com","123"],耗时:1.26ms
5、数据库事务
很多时候,我们需要执行一连串操作,而其中任何一个操作出错则整个流程失败,需要回退重来,这个时候我们就要用到数据库事务。
DB门面提供两种方式支持数据库事务,一种是调用transaction
方法然后传入闭包作为参数,我们将需要进行事务操作的逻辑放到闭包函数内:
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门面提供的事务还支持查询构建器和Eloquent ORM数据库操作。
转:http://laravelacademy.org/post/854.html