クイックスタート
- ネイティブ SQL クエリを実行する
- クエリ イベントをリッスン
- データベース トランザクション
はじめに
Laravel を使用すると、ネイティブ SQL、流暢なクエリ ビルダー、Eloquent ORM を使用して、さまざまなデータベース バックエンドでデータベースとの非常に簡単な対話が可能になります。 Laravel は現在 4 つのデータベースをサポートしています:
構成データベース構成ファイルは- #MySQL
- PostgreSQL
- SQLite
- SQL Server
config/database.php
デフォルトでは、Laravel のサンプル環境構成では Laravel Homestead (これは、Laravel をローカルで簡単に開発できる小さな仮想マシンです) を使用します。ローカル データベースのニーズに応じてこの構成を変更できます。 SQLite 構成ファイルに配置されます。すべてのデータベース接続をここで定義でき、デフォルトで使用される接続を指定できます。このファイルには、Laravel でサポートされているほとんどのデータベース構成の例が含まれています。
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という 3 つのキーが構成配列に追加されていることに注意してください。
readと
writeのキーには両方とも、キー
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
ファサードは、各タイプのクエリのメソッドを提供します:select
、update
、insert
、delete
、# ##声明###。選択クエリの実行DBファサードの
selectselect
メソッドを使用して、基本的なクエリ ステートメントを実行できます。<?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]); } }
メソッドに渡される最初のパラメータはネイティブ SQL クエリで、2 番目のパラメータはクエリにバインドする必要があるパラメータ値です。通常、これらの値は制約
selectwhere
ステートメントで使用されます。パラメータ バインディングは、SQL インジェクションを防ぐために使用されます。メソッドは常に配列を返します。配列内の各結果は =
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 にも適用されます。