Laravel Eloquent①
本記事の内容
今記事では、LaravelのEloquentを説明していきます。
複数の記事に分けるため、興味ある方は辿って閲覧下さい。
Eloquentって何?
Eloquentとは、LaravelにおけるORMです。データの取得・登録・更新・削除だけでなく、データの加工なども簡単に行うことができます。
また、SQLインジェクションなど脆弱性に対する対策も行われるため、生のSQLを流すよりセキュアです。
Eloquentを使用するための準備
Eloquentを使用するためには、データベースと紐づくモデルを作成する必要があります。
通常はapp/Models
配下に各モデルを作成する。
Laravelには、モデルを作成するコマンドが予め用意さえれているため、そちらを使用して作成します。
php artisan make:model Test
// マイグレーションファイルも同時に作成したい場合は、以下のコマンドを実行
php artisan make:model Test --migration
モデルの全ての属性やリレーションを確認したい場合は、以下のコマンドを実行
php artisan model:show Test
Eloquentの規約
Laravelにおいてモデルはアッパーキャメルケースの単数系で命名する。しかし、データベースにおけるテーブル名は、スネークケースの複数系で命名する。
モデルの取得(データベースからレコードを取得)
Eloquentを使用する最大の目的であるモデルの取得について説明します。
■主キーを元に1件取得
find()
を使用して、主キーを指定してレコードを取得します。
// 主キーが1のレコードを取得
$tests = Test::first(1);
■全件取得
all()
メソッドを用いて、全件取得クエリを実行します。
$tests = Test::all();
■条件付き取得
all()
は全件取得でしたが、idが1のデータ
や論理削除済み以外のデータ
など条件を絞って取得したい場合もありますよね。
その場合は、get()
を使用して取得します。条件式の記載方法も記載しておきます。
// activeカラムが1で、名前順となっているレコードを10件取得
$tests = Test::where('active', 1)
->orderBy('name')
->take(10)
->get();
■大量のデータを取得する場合
システムによっては、数万件のデータを取得しなければならない場合もあるかと思います。
その際に、all()
やget()
を使用するとメモリ不足などにより、エラーに繋がる可能性があります。
そのため、一気に取得するのではなく、定量に小分けして取得するchunk
という機能があります。
具体的には以下のような処理で、200件ずつ取得し、取得したデータに別途処理を実行することが可能。
use App\Models\Test;
Test::chunk(200, function ($tests) {
foreach ($tests as $test) {
// 各レコードごとに処理が可能
}
});
chunk()
はid順に取得できることが確約できておらず、パフォーマンスに問題がある。
そのため、chunkById()
が使用できるのであれば、そちらを使用すると良い。
■サブクエリの実行
複雑なクエリを実行するにはサブクエリを実行する必要がある。
サブクエリを使用するためにはaddSelect()
を使用して処理を実行する。
以下は、フライトの目的地テーブルと、フライトテーブルからサブクエリを実行している例である。
→公式ドキュメントより抜粋
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderByDesc('arrived_at')
->limit(1)
])->get();
■集計
レコードを取得する際に、全レコード数や合計値値などを取得することもできる。
// activeが1であるレコード数
$count = Test::where('active', 1)->count();
// activeが1のpriceが最大のレコード
$max = Test::where('active', 1)->max('price');
今回は、取得まで説明しました!
次回はレコードの登録・更新系を説明します。
おわり
Discussion