라라벨 소개

데이터베이스: 시작하기

소개

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개의 키가 추가되었습니다  stickyread 둘  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 로  전달 하면   구성 파일에서 해당 이름으로 연결을 사용할 수 있습니다.connectionconfig/database.php

$users = DB::connection('foo')->select(...);

연결된 인스턴스의 메서드를 사용하여 기본 PDO 인스턴스에 액세스할 수도 있습니다  getPdo .

$pdo = DB::connection()->getPdo();

기본 SQL 쿼리 실행

데이터베이스 연결을 구성한 후  DB Facade를 사용하여 쿼리를 실행할 수 있습니다. DB Facade는 각 쿼리 유형(  select ,  update ,   및 )  에 대한 메소드 insert 를  제공합니다 .deletestatement

선택 쿼리 실행

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 에도 적용됩니다 .

추천

출처blog.csdn.net/xyy_forever/article/details/82837941