Laravel支持多种数据库,包括MySQL、Postgres、SQLite和SQL Server,在Laravel中连接数据库和查询数据库都非常简单,我们可以使用多种方式与数据库进行交互,包括原生SQL语句、查询构建器以及Eloquent ORM。本节我们先演示如何使用原生SQL在Laravel应用中对数据库进行增删改查。

使用DB门面进行增删改查

1 插入数据

我们使用DB门面执行原生SQL语句,插入操作使用DB门面的insert方法,代码如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller; 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方法中注册该监听器,例如我们在AppServiceProviderboot方法中定义监听器如下:

/**
* 启动所有应用服务
*
* @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

最新文章

  1. 使用WinRAR创建可执行程序(例如:Java程序打包 成exe)
  2. selenium遇到异常自动截图
  3. 三种找回 linux root密码
  4. 查找当前SQL Server下的Active Session正连接着哪个数据库
  5. 8个超炫酷的纯CSS3动画及源码分享
  6. 完整DataTable与IList互换(转)
  7. Android开发之EventBus的简单使用
  8. 如何搭建MVC3与配置models层
  9. web-service客户端与服务器端的连接
  10. RecyclerView 刷新后自动滚动的问题,notifyDataSetChanged 后自己滚动
  11. vue路由参数变化刷新数据
  12. 一些常用的meta标签
  13. [译]Ocelot - Middleware Injection and Overrides
  14. 开发mis系统需要的技术
  15. python 读取大文件,按照字节读取
  16. Map获取key值
  17. 每日踩坑 2019-04-08 VS2015未能找到路径“…\bin\roslyn\csc.exe”的解决方案
  18. Unity 官方文档学习
  19. 剑指offer编程题Java实现——面试题7用两个栈实现队列
  20. left join 如何增加where条件(在on的后面),这很重要

热门文章

  1. 【原创】SSIS-执行包任务调用子包且子包读取父包变量
  2. 使用Vagrant打造Linux开发环境
  3. JAVA SERVLET上传文件的样码
  4. Vue v-for嵌套数据渲染问题
  5. MSSQL-字符串分离与列记录合并成一行混合使用
  6. POJ 2689.Prime Distance-区间筛素数
  7. 十. 图形界面(GUI)设计1.图形界面设计基础
  8. 50个最常用的UNIX/Linux命令
  9. [置顶] kubernetes--优雅删除资源对象
  10. Spring: aop自动标注时出现 “0 formal unbound in pointcut&quot;