快速入门 | 数据库 |《Laravel 6 中文文档 6.x》| Laravel China 社区


本站和网页 https://learnku.com/docs/laravel/6.x/database/5170 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

快速入门 | 数据库 |《Laravel 6 中文文档 6.x》| Laravel China 社区
Laravel
话题列表
社区 Wiki
优质外文
招聘求职
Laravel 实战教程
社区文档
登录
注册
Laravel 6 中文文档
展开或关闭
前言
发行说明
升级说明
贡献导引
入门指南
安装
配置信息
文件夹结构
Homestead
Valet
部署
核心架构
请求周期
服务容器
服务提供者
Facades
契约
基础功能
路由
中间件
CSRF 保护
控制器
请求
响应
视图
生成 URL
Session
表单验证
错误
日志
前端开发
Blade 模板
本地化
前端指南
编辑资源 Mix
安全相关
用户认证
API 认证
用户授权
Email 认证
加密解密
哈希
重置密码
综合话题
Artisan 命令行
广播系统
缓存系统
集合
事件系统
文件存储
辅助函数
邮件发送
消息通知
扩展包开发
队列
任务调度
数据库
快速入门
查询构造器
分页
数据库迁移
数据填充
Redis
Eloquent ORM
快速入门
模型关联
Eloquent 集合
修改器
API 资源
序列化
测试相关
快速入门
HTTP 测试
命令行测试
数据库测试
测试模拟器 Mocking
官方扩展包
Cashier 交易工具包
Dusk 浏览器测试
Envoy 部署工具
Horizon 队列管理工具
Passport OAuth 认证
Scout 全文搜索
Socialite 社会化登录
Telescope 调试工具
Laravel
首页
Laravel
Go
PHP
Vue.js
Python
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
Server
程序员
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
教程
Laravel 实战教程首页
《L01 Laravel 教程 - Web 开发实战入门》
《L02 Laravel 教程 - Web 开发实战进阶》
《L03 Laravel 教程 - 实战构架 API 服务器》
《L04 Laravel 教程 - 微信小程序从零到发布》
《L05 Laravel 教程 - 电商实战》
《L06 Laravel 教程 - 电商进阶》
《LX1 Laravel / PHP 扩展包视频教程》
《LX2 PHP 扩展包实战教程 - 从入门到发布》
《L07 Laravel 教程 - Laravel TDD 测试实战》
《LX3 Laravel 性能优化入门》
《LX4 Laravel / PHP 五分钟视频》
文档
社区文档首页
《Laravel 中文文档》
《Laravel 速查表》
《PHP 代码简洁之道》
《Laravel 编码技巧》
《Dcat Admin 中文文档》
《Laravel Nova 中文文档》
《Lumen 中文文档》
《Dingo API 中文文档》
《 Laravel 项目开发规范》
《构建 Laravel 开发环境》
登录
注册
微信登录
提交改进
快速入门
6.x
9.x
8.5
8.x
7.x
6.x
5.8
5.7
5.6
5.5
5.4
5.3
5.2
5.1
Laravel 6 中文文档
未匹配的标注
本文档最新版为 9.x,旧版本可能放弃维护,推荐阅读最新版!
数据库:入门
简介
配置
读写分离
使用多个数据库连接
运行原生的 SQL 查询
监听查询事件
数据库事务
简介
Laravel 能使用原生 SQL、流畅的查询构造器 和 Eloquent ORM 在各种数据库后台与数据库进行非常简单的交互。当前 Laravel 支持四种数据库:
MySQL
PostgreSQL
SQLite
SQL Server
配置
数据库的配置文件放置在 config/database.php 文件中,你可以在此定义所有的数据库连接,并指定默认使用的连接。此文件内提供了大部分 Laravel 能支持的数据库配置示例。
默认情况下,Laravel 的示例 环境配置 使用了 Laravel Homestead(这是一种小型虚拟机,能让你很方便地在本地进行 Laravel 的开发)。你可以根据本地数据库的需要修改这个配置。
SQLite 配置
使用类似 touch database/database.sqlite 之类命令创建一个新的 SQLite 数据库之后,可以使用数据库的绝对路径配置环境变量来指向这个新创建的数据库:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
如果要开启 SQLite 连接的外键约束,您应该将 foreign_key_constraints 添加到 config / database.php 配置文件中:
'sqlite' => [
// ...
'foreign_key_constraints' => true,
],
URLs 式配置
通常,数据库连接使用多个配置值,例如 host, database, username, password 等。这些配置值中的每一个都有其相应的环境变量。这意味着在生产服务器上配置数据库连接信息时,需要管理多个环境变量。
一些托管数据库提供程序(如 heroku )提供单个数据库「URL」,该 url 在单个字符串中包含数据库的所有连接信息。示例数据库 URL 可能如下所示:
mysql://root:password@127.0.0.1/forge?charset=UTF-8
这些url通常遵循标准模式约定:
driver://username:password@host:port/database?options
为了方便起见,Laravel 支持这些 URLs ,作为使用多个配置选项配置数据库的替代方法。如果存在 url (或相应的 DATABASE_URL 环境变量)配置选项,则将使用该选项提取数据库连接和凭据信息。
读写分离
有时候你希望 SELECT 语句使用一个数据库连接,而 INSERT,UPDATE,和 DELETE 语句使用另一个数据库连接。在 Laravel 中,无论你是使用原生查询,查询构造器,或者是 Eloquent ORM,都能轻松的实现
为了弄明白读写分离是如何配置的,我们先来看个例子:
'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
注意在以上的例子中,配置数组中增加了三个键,分别是 read, write 和 sticky。 read 和 write 的键都包含一个键为 host 的数组。而 read 和 write 的其他数据库都在键为 mysql 的数组中。
如果你想重写主数组中的配置,只需要修改 read 和 write 数组即可。所以,这个例子中: 192.168.1.1和192.168.1.2 将作为 「读」 连接主机,而 192.168.1.3 将作为 「写」 连接主机。这两个连接会共享 mysql 数组的各项配置,如数据库的凭据(用户名 / 密码),前缀,字符编码等。
sticky 选项
sticky 是一个 可选值,它可用于立即读取在当前请求周期内已写入数据库的记录。若 sticky 选项被启用,并且当前请求周期内执行过 「写」 操作,那么任何 「读」 操作都将使用 「写」 连接。这样可确保同一个请求周期内写入的数据可以被立即读取到,从而避免主从延迟导致数据不一致的问题。不过是否启用它,取决于应用程序的需求。
使用多个数据库连接
当使用多个数据库连接时,你可以通过 DB Facade 的 connection 方法访问每一个连接。传递给 connection方法的参数 name 应该是 config/database.php 配置文件中 connections 数组中的一个值:
$users = DB::connection('foo')->select(...);
你也可以使用一个连接实例上的 getPdo 方法访问底层的 PDO 实例:
$pdo = DB::connection()->getPdo();
运行原生 SQL 查询
一旦配置好数据库连接后,便可以使用 DB facade 运行查询。 DB facade 为每种类型的查询提供了方法: select,update,insert,delete 和 statement。
运行 Select 查询
你可以使用 DB Facade 的 select 方法来运行基础的查询语句:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
/**
* 显示应用程序中所有用户的列表
* @return Response
*/
public function index()
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
传递给 select 方法的第一个参数就是一个原生的 SQL 查询,而第二个参数则是需要绑定到查询中的参数值。通常,这些值用于约束 where 语句。参数绑定用于防止 SQL 注入。
select 方法将始终返回一个数组,数组中的每个结果都是一个 StdClass 对象,可以像下面这样访问结果值:
foreach ($users as $user) {
echo $user->name;
使用命名绑定
除了使用 ? 表示参数绑定外,你也可以使用命名绑定来执行一个查询:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
运行插入语句
可以使用 DB Facade 的 insert 方法来执行 insert 语句。与 select 一样,该方法将原生 SQL 查询作为其第一个参数,并将绑定数据作为第二个参数:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
运行更新语句
update 方法用于更新数据库中现有的记录。该方法返回受该语句影响的行数:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
运行删除语句
delete 方法用于从数据库中删除记录。与 update 一样,返回受该语句影响的行数:
$deleted = DB::delete('delete from users');
运行普通语句
有些数据库语句不会有任何返回值。对于这些语句,你可以使用 DB Facade 的 statement 方法来运行:
DB::statement('drop table users');
监听查询事件
如果你想监控程序执行的每一个 SQL 查询,你可以使用 listen 方法。这个方法对于记录查询或调试非常有用。你可以在 服务提供器 中注册你的查询监听器:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
/**
* 注册服务提供器
* @return void
*/
public function register()
//
/**
* 启动应用服务
* @return void
*/
public function boot()
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
数据库事务
你可以使用 DB facade 的 transaction 方法在数据库事务中运行一组操作。如果事务的闭包 Closure 中出现一个异常,事务将会回滚。如果事务闭包 Closure 执行成功,事务将自动提交。一旦你使用了 transaction , 就不再需要担心手动回滚或提交的问题:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
处理死锁
transaction 方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
手动使用事务
如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用 DB Facade 的 beginTransaction 方法:
DB::beginTransaction();
你可以使用 rollBack 方法回滚事务:
DB::rollBack();
最后,你可以使用 commit 方法提交事务:
DB::commit();
Tip:DB facade 的事务方法同样适用于 查询构造器 和 Eloquent ORM 。
本文章首发在 LearnKu.com 网站上。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
原文地址:https://learnku.com/docs/laravel/6.x/elo...
译文地址:https://learnku.com/docs/laravel/6.x/elo...
上一篇
下一篇
Markdown 文本
纠错改进
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:6
推荐文章:
更多推荐...
博客
🎈 Slow Admin - 使用Laravel和Amis快速构建你的后台
25
35
3个月前
博客
Git速查表
28
6个月前
博客
系统崩溃了,网站响应慢了,你是如何快速定位错误信息的?
17
1年前
博客
Laravel 基于remote model 思想实现快速服务化(入门篇)
32
15
1年前
教程
E-admin无需关注JavaScript,只用php代码即可快速构建后台系统
28
40
1年前
博客
更优雅快速的为你的项目构建一个PHP版本SDK
13
1年前
讨论数量: 3
发起讨论
只看当前版本
zy5666
1个月前
swoole
个点赞 | 6 个回复 |
代码速记
| 课程版本 8.x
誓言玄夏
7个月前
正文 模型检索模块层级结构与左侧树结构不一致
个点赞 | 4 个回复 |
问答
| 课程版本 5.8
Rxy-development
9个月前
laravel8.x upsert问题
个点赞 | 2 个回复 |
问答
| 课程版本 8.x
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消