Laravel Eloquent ORM

Eloquent ORM

Eloquent ORMを利用し、モデルを介してデータベースとやりとりする

  • クエリビルダ:モデルを介さず、直接データベースとやりとりを行う
  • Eloquent ORM:モデルを介し、間接的にデータベースとやりとりを行う

Eloquent ORMにおけるクエリの書き方

すべてのクエリに共通する書き方

  1. use App\Models\モデル名;を記述してモデルのuse宣言を行う
  2. モデル名::メソッド名またはインスタンス名->メソッド名のように、モデルまたはインスタンスに対してメソッドを使う(メソッドによってモデルとインスタンスのどちらに使うかは決まっている)

    Eloquent ORMにおいてクエリビルダを使う方法

    クエリビルダのメソッドは、以下のようにモデルに対して直接使います。

use App\Models\Product;

// productsテーブルから、priceカラムの値が1000以下のデータを最大で10件まで取得する
$products = Product::where('price', '<=', 1000)->take(10)->get();

Eloquent ORM独自の代表的なメソッド

all()メソッド

all()メソッドは、モデルにマッピングされているテーブルから、すべてのデータをインスタンスのコレクションとして取得する。

  • コレクション=配列やオブジェクトを効率的に操作するための、Laravel独自のラッパークラス(「配列の強化版」)
  • ラッパークラス=あるデータ型などに対し、機能やメソッドなどを追加するために包み込む(ラップする)クラス
use App\Models\Product;

// productsテーブルから、すべてのデータをインスタンスのコレクションとして取得する
$products = Product::all();

find()メソッド

find()メソッドは、モデルにマッピングされているテーブルから、引数に指定した主キーを持つデータを単一のインスタンスとして取得

use App\Models\Product;

// productsテーブルから、主キーの値が1のデータを単一のインスタンスとして取得する
$product = Product::find(1);

クエリビルダとORMの違い

  • Eloquent ORM:引数に指定した主キーを持つデータをモデルのインスタンスとして取得
  • クエリビルダ:引数に指定した主キーを持つデータをstdClassクラスのインスタンスとして取得

first()メソッド

first()メソッドは、モデルにマッピングされているテーブルから、条件に一致する最初のデータを単一のインスタンスとして取得

use App\Models\Product;

// productsテーブルから、priceカラムの値が1000と等しい最初のデータを単一のインスタンスとして取得する
$product = Product::where('price', 1000)->first();

クエリビルダとORMの違い

  • Eloquent ORM:条件に一致する最初のデータをモデルのインスタンスとして取得
  • クエリビルダ:条件に一致する最初のデータをstdClassクラスのインスタンスとして取得

create()メソッド

create()メソッドは、連想配列として指定したカラムとその値にもとづいて、モデルにマッピングされているテーブルに新しくデータを追加

use App\Models\Product;

// product_nameカラムの値が'小物入れ'、priceカラムの値が800のデータをproductsテーブルに追加する
Product::create(['product_name' => '小物入れ', 'price' => 800]);

ただしcreate()メソッドを使うには、モデルに対して$fillableプロパティまたは$guardedプロパティを設定する必要があります(両方ではなくどちらか1つ)。
$fillableプロパティを設定する場合

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 一括代入を許可するカラム名の配列を$fillableプロパティに代入する
    protected $fillable = ['product_name', 'price'];
}

$guardedプロパティを設定する場合

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 一括代入を禁止するカラム名の配列を$guardedプロパティに代入する
    protected $guarded = ['id'];
}

update()メソッド

update()メソッドは、連想配列として指定したカラムとその値にもとづいて、モデルにマッピングされているテーブルの条件に一致するデータを一括更新

use App\Models\Product;

// productsテーブルのpriceカラムの値が1000のデータについて、priceカラムの値を1100に一括更新する
Product::where('price', 1000)->update(['price' => 1100]);

update()メソッドを使う際もcreate()メソッドと同様に、モデルに対して$fillableプロパティまたは$guardedプロパティを設定する必要があります

delete()メソッド

delete()メソッドは、モデルのインスタンスマッピングされているデータを削除する

use App\Models\Product;

// productsテーブルから、主キーの値が1のデータを単一のインスタンスとして取得する
$product = Product::find(1);

// インスタンスにマッピングされているデータを削除する
$product->delete();

以下のようにwhere()メソッドなどと組み合わせて使い、条件に一致するすべてのデータを削除することもできます。

use App\Models\Product;

// productsテーブルから、priceカラムの値が1000未満のデータをすべて削除する
Product::where('price', '<', 1000)->delete();

save()メソッド

save()メソッドは、モデルのインスタンスを保存し、モデルにマッピングされているテーブルに対してデータを追加・更新する

データを追加する場合
use App\Models\Product;

// Productモデルをインスタンス化する
$product = new Product();

// インスタンスのプロパティを一括設定する(fill()は引数として渡された連想配列でインスタンスのプロパティを一括設定するメソッド)
$product->fill(['product_name' => '小物入れ', 'price' => 800]);

// インスタンスを保存し、productsテーブルにデータを追加する
$product->save();

以下のように、fill()メソッドを使わずインスタンス化と同時にプロパティを一括設定することも可能

use App\Models\Product;

// Productモデルをインスタンス化する(同時にプロパティを一括設定する)
$product = new Product(['product_name' => '小物入れ', 'price' => 800]);

// インスタンスを保存し、productsテーブルにデータを追加する
$product->save();

なお、上記のようにプロパティを一括設定する場合、例によってモデルに対して$fillableプロパティまたは$guardedプロパティを設定する必要があります。

データを更新する場合
use App\Models\Product;

// productsテーブルから、主キーの値が1のデータを単一のインスタンスとして取得する
$product = Product::find(1);

// インスタンスのプロパティに値を代入する
$product->price = 1000;

// インスタンスを保存し、productsテーブルのデータを更新する
$product->save();