🎉

Laravel Eloquent①

2022/12/04に公開

本記事の内容

今記事では、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()が使用できるのであれば、そちらを使用すると良い。
https://kraf.jp/blog/5620

■サブクエリの実行

複雑なクエリを実行するにはサブクエリを実行する必要がある。
サブクエリを使用するためには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