데이터베이스: 시작하기
소개
Laravel은 기본 SQL, 쿼리 빌더 및 Eloquent ORM을 사용하여 다양한 데이터베이스 백엔드에서 매우 간단하게 데이터베이스와 상호 작용할 수 있습니다. 현재 Laravel은 4개의 데이터베이스를 지원합니다:
- MySQL
- 포스트그레스
- SQLite
- SQL 서버
구성
데이터베이스 구성 파일은 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 문이 다른 데이터베이스 연결을 사용하기를 원할 수도 있습니다. 기본 쿼리, 쿼리 빌더 또는 Eloquent ORM을 사용하든 Laravel에서는 매우 쉽습니다.
데이터베이스 읽기-쓰기 분리를 구성하는 방법을 이해하기 위해 다음 예를 살펴보겠습니다.
'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
및 3개의 키가 추가되었습니다 sticky
. read
둘 write
다 key 가 있는 배열을 포함합니다 host
. read
및 의 다른 데이터베이스 구성은 키가 write
있는 기본 배열에 있습니다 mysql
.
기본 배열의 구성 항목을 재정의하려면 해당 항목을 read
and 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(...);
연결된 인스턴스의 메서드를 사용하여 기본 PDO 인스턴스에 액세스할 수도 있습니다 getPdo
.
$pdo = DB::connection()->getPdo();
기본 SQL 쿼리 실행
데이터베이스 연결을 구성한 후 DB
Facade를 사용하여 쿼리를 실행할 수 있습니다. DB
Facade는 각 쿼리 유형( select
, update
, 및 ) 에 대한 메소드 insert
를 제공합니다 .delete
statement
선택 쿼리 실행
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 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);
수동으로 트랜잭션 사용
트랜잭션을 수동으로 시작하고 롤백 및 커밋을 완전히 제어하려면 Facade에서 메서드를 DB
사용할 수 있습니다.beginTransaction
DB::beginTransaction();
rollBack
다음 메소드를 사용하여 트랜잭션을 롤백 할 수 있습니다 .
DB::rollBack();
마지막으로 commit
다음 메소드를 사용하여 트랜잭션을 커밋할 수 있습니다.
DB::commit();
{tip}
DB
Facade의 트랜잭션 메소드는 쿼리 빌더 와 Eloquent ORM 에도 적용됩니다 .