laravel5.6 mysql_快速入门 |《Laravel 5.6 中文文档 5.6》| Laravel China 社区

本文档最新版为 8.x,旧版本可能放弃维护,推荐阅读最新版!

数据库:入门

简介

Laravel 能使用原生 SQL、查询构造器 和 Eloquent ORM 在各种数据库后台与数据库进行非常简单的交互。当前 Laravel 支持四种数据库:

MySQL

Postgres

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

读 & 写连接

有时候你希望 SELECT 语句使用一个数据库连接,而 INSERT、 UPDATE 和 DELETE 语句使用另一个数据库连接。在 Laravel 中这就像小菜一碟,无论你是使用原生查询,查询构造器 或者 Eloquent ORM 它都能轻松实现。

想了解数据库读写分离如何配置, 让我们看看这个例子:

'mysql' => [

'read' => [

'host' => '192.168.1.1',

],

'write' => [

'host' => '196.168.1.2'

],

'sticky' => true,

'driver' => 'mysql',

'database' => 'database',

'username' => 'root',

'password' => '',

'charset' => 'utf8mb4',

'collation' => 'utf8mb4_unicode_ci',

'prefix' => '',

],

注意在上边的例子中,配置数组中增加了 3 个键: read,write 和 sticky。 read 和 write 都包含一个键为 host 的数组。而 read 和 write 的其它数据库配置都在键为 mysql 的主数组中:

如果你希望重写主数组的某个配置项,只需要将它放入 read 和 write 的数组中即可。 所以,这个例子中: 192.168.1.1 将用作「读」连接的主机, 而 192.168.1.2 将作为「写」连接的主机。这两个连接会共享 mysql 主数组的各项配置,如数据库的凭据,前缀,字符编码 等。

sticky 选项

sticky 是一个 可选 值,它可用于立即读取在当前请求周期内已写入数据库的记录。若 sticky 被启用,并且当前请求周期内执行过「写」操作,那么任何「读」操作都将使用「写」连接。这样可确保同一周期内写入的数据在同一周期内都可以被立即读取。它是否启用,取决于应用程序的需求。

使用多个数据库连接

当使用多个数据库连接时,你可以通过 DB facade 的 connection 方法访问每一个连接。将 name 作为 connection 方法的参数传递,即可使用 config/database.php 配置文件中对应名称的连接:

$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 方法来运行基础的查询语句:

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 方法。这个方法对于记录查询或调试非常有用。你可以在 服务提供器 中注册你的查询监听器:

namespace App\Providers;

use Illuminate\Support\Facades\DB;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider

{

/**

* 启动应用服务

*

* @return void

*/

public function boot()

{

DB::listen(function ($query) {

// $query->sql

// $query->bindings

// $query->time

});

}

/**

* 注册服务提供器

*

* @return void

*/

public function register()

{

//

}

}

数据库事务

你可以使用 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。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接

我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机二级web题目(5)--js(Javascript)基础

1 [单选题] 在以下选项中,不合法的标识符是(A)。 A. a*b B. small C. score D. average grade 解析&#xff1a;点击查看标识符命名规则 2 [单选题]在HTML页面中哪些部分能够插入JavaScript?&#xff08;C&#xff09; A. <body>部分 B. <head>部分 C. <body&g…

使用JUnit 5在Mockito中方便地进行模拟–官方方式

从版本2.17.0开始&#xff0c;如果使用JUnit 5&#xff0c; Mockito提供了官方&#xff08;内置&#xff09;支持来管理模拟生命周期。 入门 为了利用该集成&#xff0c;需要在JUnit 5的junit-platform-engine旁边添加Mockito的mockito-junit-jupiter依赖项&#xff08;有关详…

esp32搭建文件服务器,ESP32入门示例 - SD卡Web服务器

这个是来自ESP32官方示例的改版&#xff0c;官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题&#xff0c;所以进行了一些修改主要修改有&#xff1a;1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录页&#xff0c;访问根目录就可以看到3.修改了…

mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

一、 MySQLMyCat分库分表1 MyCat简介java编写的数据库中间件Mycat运行环境需要JDK。Mycat是中间件&#xff0c;运行在代码应用和MySQL数据库之间的应用。前身&#xff1a; corba&#xff0c;是阿里开发的数据库中间件&#xff0c;实现MySQL数据库分库分表集群管理的中间件&…

字符串String截取字符char

字符串类的charAt() 方法可返回指定位置的字符。 stringObject.charAt(index)从键盘输入获取了一个字符串&#xff0c;将其数据类型转换为字符型。 Scanner scan new Scanner(System.in); String str scan.next(); char ca str.charAt(0);示例&#xff1a; import java.u…

gradle构建工具_Gradle:我们需要另一个构建工具吗?

gradle构建工具在Java开发的早期&#xff0c;我们要么没有太多的构建工具需求&#xff0c;要么就使用了其他环境中的工具。 我仍然记得构建shell脚本并创建用于开发Java的文件。 生成文件特别有趣&#xff0c;因为这是一个在设计时就没有考虑到Java的工具。 迁移到不同的操作系…

db platform mysql_数据库移植: 从Oracle移植到MySQL 注意databasePlatform | 学步园

采用Spring框架、JPA操作数据库开发一个小网站过程中&#xff0c;遇到需要将数据库从Oracle移植到MySQL&#xff0c;在进行单元测试时遇到如下错误&#xff1a;Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown table SEQ_GEN_IDENTIT…

Java基本语法(14)--for循环结构

循环结构&#xff1a;在某些条件满足的情况下&#xff0c;反复执行特定代码的功能。 基本格式&#xff1a; for (①初始化部分; ②循环条件部分; ④迭代部分)&#xff5b; ③循环体部分; &#xff5d;如果①&#xff0c;④部分多条语句&#xff0c;语句之间用“&#xff0c;”…

Java 8中的功能接口是什么? @功能注释和示例

函数接口是Java 8最重要的概念之一&#xff0c;实际上为lambda表达式提供了动力&#xff0c;但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它&#xff0c;并花时间学习lambda表达式和Stream API。除非您知道什么是功能接口以及lambda与它之间的关…

win10存储池_3个光威480G SSD组WIN10存储池,深度测试到底值不值得搞

上次由于我SSD不够&#xff0c;所以我用虚拟硬盘的方式&#xff0c;虚拟了3个VHDX硬盘&#xff0c;组了个奇偶校验的存储池&#xff0c;并且简单的做了测试。测试结果是&#xff0c;组存储池确实提高了我们的数据安全性。WIN10存储池&#xff0c;可以让我们玩家省去组RAID&…

求最大公约数最小公倍数

最大公约数小于两个数小的那个&#xff0c;最小公倍数大于两个数大的那个。 求最大公约数从大到小寻找&#xff0c;求最小公倍数从小到大寻找&#xff0c;也就是说循环方向。 import java.util.Scanner;public class JavaTest {public static void main(String[] args) {//从键…

biginteger和long精度_修复Long类型太长,而Java序列化JSON丢失精度问题的方法

造成原因&#xff1a;JS内置有32位整数&#xff0c;而number类型的安全整数是53位。如果超过53位&#xff0c;则精度会丢失。正如现在后台传来一个64位的Long型整数&#xff0c;因此超过了53位&#xff0c;所以后台返回的值和前台获取的值会不一样。Java序列化JSON时long型数值…

Java基本语法(15)--while循环结构do-while循环结构

基本格式 ①初始化部分 while(②循环条件部分)&#xff5b;③循环体部分;④迭代部分; }①初始化部分; do{③循环体部分;④迭代部分; }while(②循环条件部分);注意不要忘记声明④迭代部分。否则&#xff0c;循环将不能结束&#xff0c;变成死循环。 while循环先判断后循环体&a…

截止角频率和截止频率的关系_开关电源的控制环截止频率和开关频率有什么关系?...

【新朋友】点击上方蓝字“电源之家”关注【老朋友】点击右上角按钮&#xff0c;分享到朋友圈电源之家官方技术③群&#xff1a;522815202(3000人群)(电源行业第一大技术交流QQ群)这个问题很专业&#xff0c;因此答案注定也专业而非科普&#xff0c;非电力电子专业小伙伴看不懂很…

restlet_Restlet框架– Hello World示例

restletRestlet是用于Java平台的轻量级&#xff0c;全面的开源REST框架。 Restlet适用于服务器和客户端Web应用程序。 它支持主要的Internet传输&#xff0c;数据格式和服务描述标准&#xff0c;例如HTTP和HTTPS&#xff0c;SMTP&#xff0c;XML&#xff0c;JSON&#xff0c;At…

mysql数据库表复制备份_mysql数据库的备份以及表格数据之间的复制

#####-------------mysql数据备份以及表间数据的复制-------------------#######----------------我的mysql学习(二)--------------------------#####mysql数据的导入和导出--这里承接上一部分#导出全部数据库该操作在mysql命令行外进行&#xff1a;导出数据格式如下&#xff1…

求100以内质数或者更多

方法① public class JavaTest {public static void main(String[] args) {Label1: for (int i 2;i < 100;i){for (int j 2;j < i;j){if (i % j 0){continue Label1;}};System.out.println(i);}} }方法② public class JavaTest {public static void main(String[] …

在运行时在Spring Cloud Config中刷新属性配置

在本系列Spring Cloud Config的教程系列中&#xff0c;我们将讨论在运行时刷新属性配置的过程&#xff0c;我们将使用Spring Boot致动器/refresh端点进行/refresh 。 此外&#xff0c;我们还将研究使用RefreshScope注释刷新Value属性。 在我的Spring Cloud Config的上一教程中…

pythonnumpy教程_Python学习教程:通俗易懂的Numpy入门教程

Numpy是python语言中最基础和最强大的科学计算和数据处理的工具包&#xff0c;如数据分析工具pandas也是基于numpy构建的&#xff0c;机器学习包scikit-learn也大量使用了numpy方法。本文介绍了Numpy的n维数组在数据处理和分析的所有核心应用。目录如何构建numpy数组如何观察数…

break和continue关键字

break语句用于终止某个语句块的执行&#xff0c;用在循环中表示跳出循环。 continue只能使用在循环结构中&#xff0c;用于跳过其所在循环当次执行&#xff0c;进入下一次循环执行。 二者功能类似&#xff0c;但continue是终止本次循环&#xff0c;break是终止本层循环。 brea…