빠른 시작
ㅋㅋ
다중 데이터베이스 연결 사용
- 기본 SQL 쿼리 실행
- 쿼리 이벤트 수신
- 데이터베이스 트랜잭션
-
소개
Laravel은 기본 SQL, 유창한 쿼리 빌더 및 Eloquent ORM을 사용하여 다양한 데이터베이스 백엔드에서 매우 간단하게 데이터베이스와 상호 작용할 수 있습니다. Laravel은 현재 4개의 데이터베이스를 지원합니다:
- MySQL
- PostgreSQL
- SQLite
- SQL Server
Configuration
데이터베이스 구성 파일은 다음 위치에 있습니다. .php < /code> 파일에서 모든 데이터베이스 연결을 정의하고 기본적으로 사용할 연결을 지정할 수 있습니다. 이 파일은 Laravel이 지원하는 대부분의 데이터베이스 구성의 예를 제공합니다.
config/database.php
文件中,你可以在此定义所有的数据库连接,并指定默认使用的连接。此文件内提供了大部分 Laravel 能支持的数据库配置示例。默认情况下,Laravel 的示例 环境配置 使用了 Laravel Homestead(这是一种小型虚拟机,能让你很方便地在本地进行 Laravel 的开发)。你可以根据本地数据库的需要修改这个配置。
SQLite 配置
使用类似
touch database/database.sqlite
之类命令创建一个新的 SQLite 数据库之后,可以使用数据库的绝对路径配置环境变量来指向这个新创建的数据库:DB_CONNECTION=sqliteDB_DATABASE=/absolute/path/to/database.sqlite
如果要开启 SQLite 连接的外键约束,您应该将
foreign_key_constraints
添加到config / database.php
配置文件中:'sqlite' => [ // ... 'foreign_key_constraints' => true, ],
读写分离
有时候你希望 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' => '', ],
注意在以上的例子中,配置数组中增加了三个键,分别是
read
,write
和sticky
。read
和write
的键都包含一个键为host
的数组。而read
和write
的其他数据库都在键为mysql
的数组中。如果你想重写主数组中的配置,只需要修改
기본적으로 Laravel의 샘플 환경 구성은 Laravel Homestead(Laravel을 로컬에서 쉽게 개발할 수 있는 작은 가상 머신)를 사용합니다. 로컬 데이터베이스의 필요에 따라 이 구성을 수정할 수 있습니다.read
和write
数组即可。所以,这个例子中:192.168.1.1
将作为 「读」 连接主机,而192.168.1.2
将作为 「写」 连接主机。这两个连接会共享mysql
SQLite 구성
🎜touch Database/database.sqlite
와 같은 명령을 사용하여 새 SQLite를 생성하세요. 데이터베이스의 절대 경로를 사용하여 새로 생성된 데이터베이스를 가리키도록 환경 변수를 구성할 수 있습니다: 🎜$users = DB::connection('foo')->select(...);
🎜 SQLite 연결에 대한 외래 키 제약 조건을 활성화하려면foreign_key_constraints
를 추가해야 합니다.config / Database.php
로 구성 파일에서: 🎜$pdo = DB::connection()->getPdo();
🎜🎜🎜🎜🎜읽기-쓰기 분리🎜🎜때때로 SELECT 문에서 하나의 데이터베이스 연결을 사용하고 INSERT, UPDATE 및 DELETE 문에서 다른 데이터베이스 연결을 사용하고 싶을 때가 있습니다. Laravel에서는 기본 쿼리, 쿼리 빌더 또는 Eloquent ORM을 사용하여 쉽게 구현할 수 있습니다.🎜🎜읽기-쓰기 분리가 어떻게 구성되어 있는지 이해하기 위해 먼저 예를 살펴보겠습니다.🎜<?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]); } }
🎜위에서 예를 들어read
,write
및sticky
라는 세 개의 키가 구성 배열에 추가됩니다.read
및write
키에는host
키가 있는 배열이 포함되어 있습니다.read
및write
에 대한 다른 데이터베이스는mysql
키가 있는 배열에 있습니다. 🎜🎜기본 배열의 구성을 재정의하려면read
및write
배열을 수정하면 됩니다. 따라서 이 예에서192.168.1.1
은 "읽기"로 호스트에 연결하고,192.168.1.2
는 "쓰기"로 호스트에 연결합니다. 이 두 연결은 데이터베이스 자격 증명(사용자 이름/비밀번호), 접두사, 문자 인코딩 등과 같은mysql
배열의 다양한 구성을 공유합니다. 🎜🎜🎜sticky
옵션sticky
는 데이터베이스에 기록된 레코드를 즉시 읽는 데 사용할 수 있는 선택 값입니다.고정
옵션이 활성화되고 현재 요청 주기 동안 "쓰기" 작업이 수행되는 경우 모든 "읽기" 작업은 "쓰기" 연결을 사용합니다. 이를 통해 동일한 요청 주기에 작성된 데이터를 즉시 읽을 수 있으므로 마스터-슬레이브 지연으로 인한 데이터 불일치 문제를 피할 수 있습니다. 그러나 활성화 여부는 애플리케이션의 요구 사항에 따라 다릅니다.sticky
选项sticky
是一个 可选值,它可用于立即读取在当前请求周期内已写入数据库的记录。若sticky
选项被启用,并且当前请求周期内执行过 「写」 操作,那么任何 「读」 操作都将使用 「写」 连接。这样可确保同一个请求周期内写入的数据可以被立即读取到,从而避免主从延迟导致数据不一致的问题。不过是否启用它,取决于应用程序的需求。使用多个数据库连接
当使用多个数据库连接时,你可以通过
DB
Facade 的connection
方法访问每一个连接。传递给connection
方法的参数name
应该是config/database.php
配置文件中 connections 数组中的一个值:foreach ($users as $user) { echo $user->name; }
你也可以使用一个连接实例上的
getPdo
方法访问底层的 PDO 实例:$results = DB::select('select * from users where id = :id', ['id' => 1]);
运行原生 SQL 查询
一旦配置好数据库连接后,便可以使用
DB
facade 运行查询。DB
facade 为每种类型的查询提供了方法:select
,update
,insert
,delete
和statement
。运行 Select 查询
你可以使用
DB
Facade 的select
方法来运行基础的查询语句:DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
传递给
select
方法的第一个参数就是一个原生的 SQL 查询,而第二个参数则是需要绑定到查询中的参数值。通常,这些值用于约束where
语句。参数绑定用于防止 SQL 注入。select
方法将始终返回一个数组,数组中的每个结果都是一个 =StdClass
对象,可以像下面这样访问结果值:$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
使用命名绑定
除了使用
?
表示参数绑定外,你也可以使用命名绑定来执行一个查询:$deleted = DB::delete('delete from users');
运行插入语句
可以使用
DB
Facade 的insert
方法来执行insert
语句。与select
一样,该方法将原生 SQL 查询作为其第一个参数,并将绑定数据作为第二个参数:DB::statement('drop table users');
运行更新语句
update
여러 데이터베이스 연결 사용
여러 데이터베이스 연결을 사용하는 경우
DB
Facade의connection
메소드를 통해 각 연결에 액세스할 수 있습니다.connection
메소드에 전달된 매개변수name
은config/database.php
구성 파일에 있는 연결 배열의 값이어야 합니다:<?php 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() { // } }
< p> 연결 인스턴스에서getPdo
메서드를 사용하여 기본 PDO 인스턴스에 액세스할 수도 있습니다: 🎜DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
🎜기본 SQL 쿼리 실행
데이터베이스 연결이 구성되면
DB
퍼사드를 사용하여 쿼리를 실행할 수 있습니다.DB
파사드는 각 쿼리 유형에 대한 메소드를 제공합니다:select
,update
,insert
,delete < /code> 및
문
. 🎜🎜🎜선택 쿼리 실행DB
의select
메서드를 사용할 수 있습니다. Facade 기본 쿼리 문을 실행하려면: 🎜DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }, 5);
select
메서드에 전달된 첫 번째 매개 변수는 기본 SQL 쿼리이고 두 번째 매개 변수는 쿼리에 바인딩해야 하는 매개 변수입니다. 값. 일반적으로 이러한 값은where
문을 제한하는 데 사용됩니다. 매개변수 바인딩은 SQL 삽입을 방지하는 데 사용됩니다. 🎜select
메소드는 항상 배열을 반환하며 배열의 각 결과는 =StdClass
개체이며 결과 값은 다음과 같이 액세스할 수 있습니다. 🎜DB::beginTransaction();
< div name="5be97e" data-unique="5be97e">🎜🎜명명된 바인딩 사용?
를 사용하여 매개변수 바인딩을 나타내는 것 외에도 명명된 바인딩을 사용하여 실행할 수도 있습니다. 쿼리: 🎜DB::rollBack();
🎜🎜삽입 문 실행
메서드입니다.DB 삽입
insert
문을 실행하는 Facadeselect
와 마찬가지로 이 메서드는 기본 SQL 쿼리를 첫 번째 매개변수로 사용하고 바인딩된 데이터를 두 번째 매개변수로 사용합니다. 🎜DB::commit();
🎜🎜Run 업데이트 문update
메서드는 데이터베이스의 기존 레코드를 업데이트하는 데 사용됩니다. 이 메소드는 다음 명령문의 영향을 받은 행 수를 반환합니다. 🎜rrreee🎜🎜Run delete 문
rrreeedelete
메소드는 데이터베이스에서 레코드를 삭제하는 데 사용됩니다.update
와 마찬가지로 명령문의 영향을 받은 행 수를 반환합니다.delete
方法用于从数据库中删除记录。与update
一样,返回受该语句影响的行数:运行普通语句
有些数据库语句不会有任何返回值。对于这些语句,你可以使用
rrreeeDB
Facade 的statement
方法来运行:监听查询事件
如果你想监控程序执行的每一个 SQL 查询,你可以使用
rrreeelisten
方法。这个方法对于记录查询或调试非常有用。你可以在 服务提供器 中注册你的查询监听器:数据库事务
你可以使用
rrreeeDB
facade 的transaction
方法在数据库事务中运行一组操作。如果事务的闭包Closure
中出现一个异常,事务将会回滚。如果事务闭包Closure
执行成功,事务将自动提交。一旦你使用了transaction
, 就不再需要担心手动回滚或提交的问题:处理死锁
rrreeetransaction
方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常:手动使用事务
如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用
rrreeeDB
Facade 的beginTransaction
方法:你可以使用
rrreeerollBack
方法回滚事务:最后,你可以使用
rrreeecommit
方法提交事务:{tip}
🎜DB
rrreee🎜쿼리 이벤트 수신
🎜프로그램에서 실행되는 모든 SQL 쿼리를 모니터링하려면listen<을 사용할 수 있습니다. /코드> 메소드. 이 방법은 쿼리 로깅이나 디버깅에 유용합니다. 서비스 제공업체에 쿼리 리스너를 등록할 수 있습니다: 🎜rrreee🎜🎜🎜
🎜데이터베이스 트랜잭션
🎜DB
파사드의transaction
메소드를 사용하여 데이터베이스 트랜잭션 내에서 일련의 작업을 실행할 수 있습니다. 트랜잭션 클로저Closure
에서 예외가 발생하면 트랜잭션이 롤백됩니다. 트랜잭션 클로저Closure
가 성공적으로 실행되면 트랜잭션이 자동으로 커밋됩니다.트랜잭션
을 사용하면 더 이상 수동 롤백이나 커밋에 대해 걱정할 필요가 없습니다. 🎜rrreee🎜🎜교착 상태 처리🎜🎜transaction
메소드는 교착 상태가 발생할 때 트랜잭션이 반복되는 횟수를 나타내는 데 사용되는 선택적 두 번째 매개 변수를 허용합니다. 정의된 시도 횟수가 완료되면 예외가 발생합니다: 🎜rrreee🎜🎜수동으로 거래를 사용하세요🎜🎜수동으로 거래를 시작하고 반환하려는 경우 it 롤과 커밋을 완전히 제어할 수 있는 경우DB
Facade의beginTransaction
메서드를 사용할 수 있습니다. 🎜rrreee🎜rollBack
메서드를 사용할 수 있습니다. 트랜잭션을 롤백하려면: 🎜rrreee🎜마지막으로commit
메서드를 사용하여 트랜잭션을 커밋할 수 있습니다: 🎜rrreee🎜{tip}
DB
의 트랜잭션 메서드 Facade는 쿼리 빌더와 Eloquent ORM에도 적용됩니다.🎜🎜🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜