クイックスタート


    ネイティブ SQL クエリを実行する
  • はじめに

    Laravel を使用すると、ネイティブ SQL、流暢なクエリ ビルダー、Eloquent ORM を使用して、さまざまなデータベース バックエンドでデータベースとの非常に簡単な対話が可能になります。 Laravel は現在 4 つのデータベースをサポートしています:

    • #MySQL
    • PostgreSQL
    • SQLite
    • SQL Server

    構成

    データベース構成ファイルは

    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_constraintsconfig/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'    => '',
      ],

    上記の例では、

    readwritesticky という 3 つのキーが構成配列に追加されていることに注意してください。 readwrite のキーには両方とも、キー host を持つ配列が含まれています。 read および write の他のデータベースは、キー mysql を持つ配列内にあります。

    メイン配列の構成をオーバーライドする場合は、

    read および write 配列を変更するだけです。したがって、この例では、192.168.1.1 は「読み取り」としてホストに接続し、192.168.1.2 は「書き込み」としてホストに接続します。これら 2 つの接続は、データベース資格情報 (ユーザー名/パスワード)、プレフィックス、文字エンコーディングなど、mysql 配列のさまざまな構成を共有します。

    sticky オプション

    sticky は、現在のリクエスト中に書き込まれた内容をすぐに読み取るために使用できる オプションの値です。サイクルデータベースレコード。 sticky オプションが有効で、現在のリクエスト サイクル中に「書き込み」操作が実行された場合、「読み取り」操作はすべて「書き込み」接続を使用します。これにより、同じリクエストサイクルで書き込まれたデータを即座に読み出すことができるため、マスター/スレーブの遅延によって引き起こされるデータの不整合の問題が回避されます。ただし、これを有効にするかどうかは、アプリケーションのニーズによって異なります。

    複数のデータベース接続の使用

    複数のデータベース接続を使用する場合は、DB を使用できます。 Facade の connection メソッドは各接続にアクセスします。 connection メソッドに渡されるパラメータ name は、config/database.php 構成ファイルの接続配列の値である必要があります:

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

    you 接続インスタンスの getPdo メソッドを使用して、基になる PDO インスタンスにアクセスすることもできます:

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

    ネイティブ SQL クエリの実行

    データベース接続を構成したら、DB ファサードを使用してクエリを実行できます。 DB ファサードは、各タイプのクエリのメソッドを提供します: selectupdateinsertdelete、# ##声明###。

    選択クエリの実行

    DB

    ファサードの 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 クエリで、2 番目のパラメータはクエリにバインドする必要があるパラメータ値です。通常、これらの値は制約 where ステートメントで使用されます。パラメータ バインディングは、SQL インジェクションを防ぐために使用されます。

    select

    メソッドは常に配列を返します。配列内の各結果は = StdClass オブジェクトであり、結果の値には次のようにアクセスできます。

    foreach ($users as $user) { 
       echo $user->name;
     }

    名前付きバインディングの使用

    ?

    を使用してパラメータ バインディングを示すことに加えて、名前付きバインディングを使用してクエリを実行することもできます:

    $results = DB::select('select * from users where id = :id', ['id' => 1]);

    挿入ステートメントの実行

    DB

    ファサードの insert メソッドを使用して、insert## を実行できます。 # 声明。 select と同様、このメソッドはネイティブ SQL クエリを最初のパラメーターとして受け取り、バインドされたデータを 2 番目のパラメーターとして受け取ります。

    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 ファサードの 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()  
          {      
            //   
           }
      }

    Database Transaction

    ## を使用できます。 #DB ファサードの transaction メソッドは、データベース トランザクション内で一連の操作を実行します。トランザクションのクロージャ Closure で例外が発生した場合、トランザクションはロールバックされます。トランザクション クロージャ Closure が正常に実行されると、トランザクションは自動的にコミットされます。 transaction を使用すると、手動のロールバックやコミットについて心配する必要がなくなります。

    DB::transaction(function () {  
      DB::table('users')->update(['votes' => 1]);    
      DB::table('posts')->delete();
     });

    デッドロックの処理

    トランザクション メソッドはオプションの 2 番目のパラメーターを受け入れます。このパラメーターは、デッドロックが発生したときにトランザクションが繰り返される回数を示すために使用されます。定義された試行回数が完了すると、例外がスローされます。

    DB::transaction(function () { 
       DB::table('users')->update(['votes' => 1]);    
       DB::table('posts')->delete();
      }, 5);

    トランザクションを手動で使用する

    トランザクションを手動で開始する場合は、次のことを確認してください。ロールバックして送信を完全に制御できる場合は、

    DB ファサードの beginTransaction メソッドを使用できます。ファサード:

    DB::beginTransaction();

    rollBack メソッドを使用して、トランザクションをロールバックします:

    DB::rollBack();

    最後に、

    commit メソッドを使用してトランザクションをコミットできます:

    DB::commit();

    {tip}

    DB ファサードのトランザクション メソッドは、クエリ Constructor および Eloquent ORM にも適用されます。

    この記事は、