2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel Eloquentのレシピ集「保存版」

Last updated at Posted at 2023-09-22

Laravel Eloquentを使う際に参考にしてください。

Laravel Eloquentは、PHPのWebアプリケーションフレームワークであるLaravelのデータベースORM(Object-Relational Mapping)ライブラリです。Eloquentは、データベーステーブルをモデルクラスとして扱い、オブジェクト指向的な方法でデータの取得、作成、更新、削除などの操作を行えます。

  1. 基本的なクエリ操作:

    • データの取得方法や条件付きの検索方法など、Eloquentを使用してデータベースクエリを実行する基本的な操作です。
  2. データの作成と保存:

    • 新しいレコードをデータベースに作成し、保存する方法に関する操作です。
  3. データの更新と削除:

    • 既存のデータを更新したり、削除したりする方法に関する操作です。
  4. リレーションシップの操作:

    • Eloquentを使用して、モデル間のリレーションシップ(関連付け)を操作する方法に関する操作です。
  5. ソートとページネーション:

    • データをソートしたり、ページネーションを実装したりする方法に関する操作です。
  6. 集計と統計:

    • データの集計や統計情報を取得する方法に関する操作です。
  7. 日付と時刻の操作:

    • データベースの日付と時刻を操作し、フォーマットする方法に関する操作です。
  8. バリデーション:

    • Eloquentモデルでバリデーションルールを定義し、データを検証する方法に関する操作です。
  9. マスアサインメント:

    • モデルでマスアサインメントを設定し、安全な属性の割り当てを制御する方法に関する操作です。
  10. グローバルスコープ:

    • グローバルスコープを使用して、クエリに自動的に制約条件を追加する方法に関する操作です。
  11. キャストと属性変換:

    • データベースカラムの値を特定の型にキャストしたり、属性を変換したりする方法に関する操作です。
  12. モデルファクトリ:

    • テストデータの生成やダミーデータの作成に役立つモデルファクトリを操作する方法に関する操作です。
  13. モデルイベント:

    • モデルイベントを使用して、特定のイベント(例:作成、更新、削除)に対するリスナーを設定する方法に関する操作です。
  14. タイムスタンプの制御:

    • モデルでタイムスタンプの動作を制御する方法に関する操作です。
  15. データベーストランザクション:

    • データベーストランザクションを開始し、コミットまたはロールバックする方法に関する操作です。

基本的なクエリ操作

Laravel Eloquentの「基本的なクエリ操作」の代表的な実例。

  1. データベースから全てのレコードを取得する:

    $users = User::all();
    
  2. 特定の条件を持つレコードを取得する:

    $admins = User::where('role', 'admin')->get();
    
  3. データベースから特定のカラムの値を取得する:

    $names = User::pluck('name');
    
  4. データベースから1つのレコードを取得する:

    $user = User::find(1);
    
  5. 新しいレコードを作成して保存する:

    $user = new User;
    $user->name = 'John Doe';
    $user->email = 'john@example.com';
    $user->save();
    
  6. レコードを一括で作成する:

    User::create([
        'name' => 'Jane Smith',
        'email' => 'jane@example.com',
    ]);
    
  7. レコードを更新する:

    $user = User::find(1);
    $user->name = 'Updated Name';
    $user->save();
    
  8. レコードを一括で更新する:

    User::where('role', 'admin')->update(['status' => 'active']);
    
  9. レコードを削除する:

    $user = User::find(1);
    $user->delete();
    
  10. 特定の条件を持つレコードを削除する:

    User::where('role', 'guest')->delete();
    
  11. 複数のwhereを配列で指定:

    User::where('id', $id)->where('name', $name);
    
    or
    
    User::where([
      ['id', '=', $id],
      ['name', '=', $name],
    ]);
    

データの作成と保存

Laravel Eloquentを使用してデータを作成し保存する代表的な実例。
新しいレコードをデータベースに挿入および保存する方法。

  1. 新しいレコードを作成して保存する:

    $user = new User;
    $user->name = 'John Doe';
    $user->email = 'john@example.com';
    $user->save();
    
  2. レコードを一括で作成して保存する:

    User::create([
        'name' => 'Jane Smith',
        'email' => 'jane@example.com',
    ]);
    
  3. 新しいレコードを作成し、保存と同時にIDを取得:

    $user = User::create([
        'name' => 'Alice Johnson',
        'email' => 'alice@example.com',
    ]);
    $userId = $user->id;
    
  4. 新しいレコードを作成し、リレーションシップを保存する:

    $post = new Post(['title' => 'New Post', 'content' => 'Content']);
    $user = User::find(1);
    $user->posts()->save($post);
    
  5. 新しいレコードを作成し、リレーションシップを一括で保存する:

    $user = User::find(1);
    $user->posts()->create([
        'title' => 'New Post',
        'content' => 'Content',
    ]);
    
  6. 新しいレコードを作成し、保存前にバリデーションを実行する:

    $data = [
        'name' => 'Bob Smith',
        'email' => 'invalid-email',
    ];
    
    $validator = Validator::make($data, [
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users',
    ]);
    
    if ($validator->fails()) {
        // バリデーションエラーの処理
    } else {
        User::create($data);
    }
    
  7. 複数のレコードを一括で作成して保存する:

    User::insert([
        ['name' => 'User 1', 'email' => 'user1@example.com'],
        ['name' => 'User 2', 'email' => 'user2@example.com'],
        // 他のレコード
    ]);
    

データの更新と削除

Laravel Eloquentを使用してデータの更新と削除を行う代表的な実例。
既存のデータを変更したり、削除したりする一般的な操作の例。

データの更新(Update):

  1. レコードを取得して属性を変更し、保存する:

    $user = User::find(1);
    $user->name = 'Updated Name';
    $user->save();
    
  2. レコードを一括で更新する:

    User::where('role', 'admin')->update(['status' => 'active']);
    
  3. リレーションシップの属性を変更して保存する:

    $user = User::find(1);
    foreach ($user->posts as $post) {
        $post->status = 'published';
        $post->save();
    }
    
  4. 複数のレコードを一括で更新する:

    User::whereIn('id', [1, 2, 3])->update(['status' => 'inactive']);
    

データの削除(Delete):

  1. レコードを取得して削除する:

    $user = User::find(1);
    $user->delete();
    
  2. 主キーを使用してレコードを削除する:

    User::destroy(1); // IDが1のレコードを削除
    
  3. 複数のレコードを一括で削除する:

    User::whereIn('id', [1, 2, 3])->delete(); // IDが1, 2, 3のレコードを削除
    
  4. 特定の条件を持つレコードを削除する:

    User::where('role', 'guest')->delete();
    
  5. リレーションシップを持つモデルの関連データを削除する:

    $user = User::find(1);
    $user->posts()->delete();
    
  6. 論理削除(ソフトデリート)を実行する:
    Laravel Eloquentでは、SoftDeletes トレイトを使用してソフトデリートを実装できます。詳細については、公式ドキュメントを参照してください。

日付と時刻の操作

Laravel Eloquentの「日付と時刻の操作」の代表的な実例。データベースの日付と時刻のカラムを操作する方法。

日付と時刻の操作の実例:

  1. 特定のカラムの日付をフォーマットする:

    $user = User::find(1);
    $formattedDate = $user->created_at->format('Y-m-d H:i:s');
    
  2. 日付を比較する:

    $users = User::whereDate('created_at', '>=', now()->subDays(7))->get();
    
  3. 日付を加算または減算する:

    $user = User::find(1);
    $newDate = $user->created_at->addDays(30); // 30日後の日付を取得
    $newDate = $user->created_at->subMonths(2); // 2ヶ月前の日付を取得
    
  4. 特定の日付範囲内のデータを取得する:

    $startDate = now()->subMonths(3);
    $endDate = now();
    $logs = Log::whereBetween('created_at', [$startDate, $endDate])->get();
    
  5. 日付をカーボン(Carbon)インスタンスとして取得する:

    $user = User::find(1);
    $createdAt = $user->created_at;
    $carbonDate = $createdAt->toCarbon();
    
  6. 日付を任意のフォーマットで表示する:

    $user = User::find(1);
    $formattedDate = $user->created_at->format('F j, Y, g:i A'); // 例: "September 23, 2023, 3:45 PM"
    
  7. タイムゾーンを設定する:

    $user = User::find(1);
    $user->created_at->setTimezone('America/New_York');
    
  8. 日付を比較して過去または未来のイベントを取得する:

    $events = Event::where('event_date', '>', now())->get(); // 未来のイベントを取得
    

バリデーション

Laravel Eloquentの「バリデーション」の代表的な実例は、データのバリデーションルールを設定し、データを検証する方法を示しています。以下は、バリデーションの代表的な実例です。

バリデーションの実例:

  1. モデルでバリデーションルールを定義する:
    モデルクラス内で$rules プロパティを定義し、バリデーションルールを設定します。

    class User extends Model
    {
        protected $rules = [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|string|min:6',
        ];
    }
    
  2. バリデーションルールを使用してデータを検証する:
    モデルを作成または更新する前に、バリデーションルールを使用してデータを検証します。

    $data = [
        'name' => 'John Doe',
        'email' => 'john@example.com',
        'password' => 'secret',
    ];
    
    $validator = Validator::make($data, $user->rules);
    
    if ($validator->fails()) {
        // バリデーションエラーの処理
    } else {
        // データを保存または更新
    }
    
  3. リクエストバリデーションを使用する:
    コントローラ内でリクエストバリデーションを使用し、入力データを検証します。

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|string|min:6',
        ]);
    
        // データを保存
    }
    
  4. カスタムバリデーションルールを作成する:
    アプリケーション固有のバリデーションルールを作成し、使用します。

    Validator::extend('custom_rule', function ($attribute, $value, $parameters, $validator) {
        // カスタムバリデーションルールの実装
        return $value % 2 == 0;
    });
    
    $data = [
        'number' => 3,
    ];
    
    $validator = Validator::make($data, [
        'number' => 'custom_rule',
    ]);
    
    if ($validator->fails()) {
        // バリデーションエラーの処理
    }
    

マスアサインメント

Laravel Eloquentの「マスアサインメント」は、モデルを作成または更新する際に、一度に複数の属性(カラム)を割り当てるための便利な方法です。以下は、「マスアサインメント」の代表的な実例です。

マスアサインメントの実例:

  1. 新しいレコードを作成して保存する:
    マスアサインメントを使用して、新しいユーザーレコードを一度に作成して保存します。

    $data = [
        'name' => 'John Doe',
        'email' => 'john@example.com',
        'password' => bcrypt('password'),
    ];
    
    User::create($data);
    
  2. 既存のレコードを更新する:
    マスアサインメントを使用して、既存のユーザーレコードを一度に更新します。

    $data = [
        'name' => 'Updated Name',
        'email' => 'updated@example.com',
    ];
    
    $user = User::find(1);
    $user->update($data);
    
  3. 保護属性(guarded)を設定する:
    モデルで guarded プロパティを設定し、マスアサインメントで設定を許可しない属性を指定します。

    class User extends Model
    {
        protected $guarded = ['id', 'admin']; // 'id'と'admin'属性はマスアサインメントから保護される
    }
    
  4. 許可する属性(fillable)を設定する:
    モデルで fillable プロパティを設定し、マスアサインメントで設定を許可する属性を指定します。

    class User extends Model
    {
        protected $fillable = ['name', 'email']; // 'name'と'email'属性のみマスアサインメントを許可する
    }
    
  5. マスアサインメントを使用せずに属性を個別に設定する:
    マスアサインメントを使用せず、属性を個別に設定してモデルを作成または更新します。

    $user = new User;
    $user->name = 'Jane Smith';
    $user->email = 'jane@example.com';
    $user->password = bcrypt('password');
    $user->save();
    
  6. 一括で属性を割り当てる:
    マスアサインメントを使用して、一括で複数の属性を割り当てます。

    $user = User::find(1);
    $user->fill([
        'name' => 'Updated Name',
        'email' => 'updated@example.com',
    ]);
    $user->save();
    

マスアサインメントを活用することで、データベース操作が効率的に行え、コードが簡潔になります。

グローバルスコープ

Laravel Eloquentの「グローバルスコープ」を使用することで、特定の制約条件をクエリに自動的に追加できます。これにより、データベースクエリ全体に影響を与える制約条件を簡単に適用できます。以下は、グローバルスコープの代表的な実例です。

  1. ソフトデリートのグローバルスコープ:
    グローバルスコープを使用して、ソフトデリート(論理削除)済みのレコードを自動的に非表示にします。

    use Illuminate\Database\Eloquent\SoftDeletes;
    
    class User extends Model
    {
        use SoftDeletes;
    
        protected static function boot()
        {
            parent::boot();
    
            static::addGlobalScope('active', function (Builder $builder) {
                $builder->whereNull('deleted_at');
            });
        }
    }
    

    この例では、User モデルに SoftDeletes トレイトを使用し、deleted_at カラムを持つことでソフトデリートを有効にしています。さらに、addGlobalScope メソッドを使用して、deleted_at カラムが null のレコードを自動的に選択するグローバルスコープを追加しています。

  2. テナントスコープ:
    マルチテナントアプリケーションで、各テナントに関連するデータを自動的に制約条件として追加することができます。

    class Post extends Model
    {
        protected static function boot()
        {
            parent::boot();
    
            static::addGlobalScope('tenant', function (Builder $builder) {
                $builder->where('tenant_id', Auth::user()->tenant_id);
            });
        }
    }
    

    この例では、Post モデルに tenant_id カラムがあると仮定し、ログインユーザーの tenant_id に基づいてレコードをフィルタリングするグローバルスコープを追加しています。

  3. アクティブなレコードのみを取得する:
    グローバルスコープを使用して、アクティブなレコードのみを取得します。

    class Product extends Model
    {
        protected static function boot()
        {
            parent::boot();
    
            static::addGlobalScope('active', function (Builder $builder) {
                $builder->where('status', 'active');
            });
        }
    }
    

    この例では、Product モデルに status カラムを持つことを仮定し、status カラムが "active" であるレコードのみを自動的に選択するグローバルスコープを追加しています。

グローバルスコープを使用することで、特定の制約条件をすべてのクエリに自動的に適用でき、コードの簡潔さと保守性を向上させることができます。

キャストと属性変換

Laravel Eloquentの「キャストと属性変換」を使用すると、データベースカラムの値を特定の型にキャストしたり、属性を変換したりすることができます。以下は、キャストと属性変換の代表的な実例です。

  1. カスタム属性のキャスト:
    モデルでカスタム属性をキャストする例です。例えば、データベースの price カラムを float 型として扱います。

    class Product extends Model
    {
        protected $casts = [
            'price' => 'float',
        ];
    }
    

    これにより、price カラムの値は常に float 型としてアクセスできます。

  2. JSONカラムのキャスト:
    JSONカラムの値を配列にキャストする例です。

    class Post extends Model
    {
        protected $casts = [
            'metadata' => 'array',
        ];
    }
    

    metadata カラムの値は、常に配列として扱われます。

  3. 日付カラムのキャスト:
    日付カラムを DateTime オブジェクトとしてキャストする例です。

    class Event extends Model
    {
        protected $casts = [
            'event_date' => 'datetime',
        ];
    }
    

    event_date カラムの値は、DateTime オブジェクトとして扱われます。

  4. Boolean カラムのキャスト:
    ブール値を扱うカラムをキャストする例です。

    class User extends Model
    {
        protected $casts = [
            'is_active' => 'boolean',
        ];
    }
    

    is_active カラムの値は、常にブール値として扱われます。

  5. カスタム属性の属性変換:
    カスタム属性を属性変換して値を取得する例です。

    class Product extends Model
    {
        public function getPriceWithCurrencyAttribute()
        {
            return '$' . number_format($this->attributes['price'], 2);
        }
    }
    

    getPriceWithCurrencyAttribute メソッドを定義することで、price_with_currency 属性をモデルから取得できます。

モデルの属性に対してデータの型や形式を制御するために使用します。データを操作し、表示する際に役立ちます。

モデルファクトリ

Laravel Eloquentの「モデルファクトリ」を使用すると、テストデータの生成やダミーデータの作成が簡単にできます。以下は、モデルファクトリの代表的な実例です。

  1. モデルファクトリの定義:
    モデルファクトリを使用して、モデルのダミーデータを定義します。

    // database/factories/UserFactory.php
    
    use Faker\Generator as Faker;
    
    $factory->define(App\User::class, function (Faker $faker) {
        return [
            'name' => $faker->name,
            'email' => $faker->unique()->safeEmail,
            'password' => bcrypt('password'),
        ];
    });
    

    この例では、User モデルのモデルファクトリを定義しています。Faker ライブラリを使用してダミーデータを生成し、nameemail、および password 属性を持つダミーデータを返します。

  2. モデルファクトリを使用してレコードを作成:
    モデルファクトリを使用して、ダミーデータを持つモデルのインスタンスを生成し、データベースに保存します。

    $user = factory(App\User::class)->create();
    

    このコードは、User モデルのインスタンスを生成し、データベースに新しいユーザーを保存します。

  3. ダミーデータの生成:
    モデルファクトリを使用して、指定した数だけダミーデータを生成します。

    $users = factory(App\User::class, 10)->create();
    

    このコードは、10個のダミーユーザーを生成し、データベースに保存します。

  4. カスタムモデルファクトリ:
    カスタムモデルファクトリを定義して、特定の属性やダミーデータをカスタマイズします。

    $factory->define(App\Post::class, function (Faker $faker) {
        return [
            'title' => $faker->sentence,
            'content' => $faker->paragraph,
            'user_id' => factory(App\User::class)->create()->id,
        ];
    });
    

    この例では、Post モデルのカスタムモデルファクトリを定義して、titlecontent、および user_id 属性を持つダミーデータを生成します。

モデルファクトリは、テストデータの生成やダミーデータの作成に非常に便利で、Laravelのテストスイートと組み合わせて使用することが一般的です。

モデルイベント

Laravel Eloquentの「モデルイベント」を使用して、特定のイベント(例: 作成、更新、削除)に対するリスナーを設定できます。以下は、「モデルイベント」の代表的な実例です。

  1. モデルの作成イベント:
    モデルが新しく作成された際に特定のアクションを実行する例です。例えば、ユーザーが作成されたときにウェルカムメールを送信します。

    class User extends Model
    {
        protected $dispatchesEvents = [
            'created' => UserCreated::class,
        ];
    }
    

    UserCreated イベントをディスパッチし、それに対応するリスナーを設定します。

  2. モデルの更新イベント:
    モデルが更新されたときに特定のアクションを実行する例です。例えば、プロファイルが更新された場合にログを記録します。

    class Profile extends Model
    {
        protected $dispatchesEvents = [
            'updated' => ProfileUpdated::class,
        ];
    }
    

    ProfileUpdated イベントをディスパッチし、それに対応するリスナーを設定します。

  3. モデルの削除イベント:
    モデルが削除されたときに特定のアクションを実行する例です。例えば、コンテンツが削除された場合に関連するファイルも削除します。

    class Content extends Model
    {
        protected $dispatchesEvents = [
            'deleted' => ContentDeleted::class,
        ];
    }
    

    ContentDeleted イベントをディスパッチし、それに対応するリスナーを設定します。

  4. カスタムモデルイベント:
    カスタムモデルイベントを設定して、特定のカスタムイベントに対するリスナーを設定します。

    class Order extends Model
    {
        protected $dispatchesEvents = [
            'order_shipped' => OrderShipped::class,
        ];
    }
    

    OrderShipped イベントをディスパッチし、それに対応するリスナーを設定します。

これらの実例は、「モデルイベント」を使用して特定のイベントに対するリスナーを設定する方法を示しています。モデルイベントを活用することで、データの変更に対するアクションを管理できます。

タイムスタンプの制御

Laravel Eloquentの「タイムスタンプの制御」は、モデル内でタイムスタンプの動作を制御する方法を提供します。以下は、「タイムスタンプの制御」の代表的な実例です。

  1. タイムスタンプの自動更新の無効化:
    モデル内で$timestamps プロパティを false に設定することで、モデルの作成日時 (created_at) および更新日時 (updated_at) の自動更新を無効にします。

    class Product extends Model
    {
        public $timestamps = false;
    }
    

    この例では、Product モデルの作成および更新のタイムスタンプを無効にしています。

  2. 特定のタイムスタンプのフォーマットの変更:
    getCreatedAtAttribute メソッドを使用して、特定のタイムスタンプのフォーマットを変更することができます。

    class User extends Model
    {
        public function getCreatedAtAttribute($value)
        {
            return \Carbon\Carbon::parse($value)->format('Y-m-d H:i:s');
        }
    }
    

    この例では、created_at タイムスタンプのフォーマットをカスタムフォーマットに変更しています。

  3. タイムスタンプのカスタムカラム名の指定:
    モデル内で $timestamps プロパティを true に設定し、カスタムのタイムスタンプカラム名を指定します。

    class Order extends Model
    {
        protected $table = 'orders';
        const CREATED_AT = 'order_created_at';
        const UPDATED_AT = 'order_updated_at';
    }
    

    この例では、Order モデルでカスタムの作成日時 (order_created_at) および更新日時 (order_updated_at) のカラム名を指定しています。

  4. タイムスタンプの無効化:
    タイムスタンプを無効にし、モデルで手動でタイムスタンプを設定します。

    class Task extends Model
    {
        public $timestamps = false;
    }
    

    この例では、Task モデルでタイムスタンプの自動更新を無効にし、手動で日付を設定する必要があります。

これらの実例は、「タイムスタンプの制御」を使用して、タイムスタンプの動作をモデルにカスタマイズする方法を示しています。モデル内でタイムスタンプの動作を調整することで、データベース操作を制御できます。

データベーストランザクション

Laravel Eloquentの「データベーストランザクション」を使用することで、複数のデータベースクエリを1つのトランザクション内で実行し、成功時にコミットまたはエラー時にロールバックできます。以下は、「データベーストランザクション」の代表的な実例です。

  1. トランザクション内でデータの作成と更新:
    データベーストランザクションを使用して、複数のデータベース操作を1つのトランザクション内でグループ化します。トランザクションが成功した場合にコミットされ、失敗した場合にロールバックされます。

    DB::beginTransaction();
    
    try {
        // データの作成
        User::create([
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => bcrypt('password'),
        ]);
    
        // データの更新
        $user = User::find(1);
        $user->update(['name' => 'Updated Name']);
    
        // 他のデータベース操作
    
        DB::commit(); // トランザクションのコミット
    } catch (\Exception $e) {
        DB::rollback(); // トランザクションのロールバック
        // エラーハンドリング
    }
    

    この例では、トランザクション内でユーザーの作成と更新を行い、エラーが発生した場合にトランザクションをロールバックします。

  2. トランザクションのネスト:
    トランザクション内でさらに別のトランザクションを開始できます。ネストされたトランザクションは、外側のトランザクションがロールバックされた場合に内側のトランザクションもロールバックされます。

    DB::beginTransaction();
    
    try {
        // 外側のトランザクション
    
        DB::beginTransaction();
    
        try {
            // 内側のトランザクション
    
            DB::commit(); // 内側のトランザクションのコミット
        } catch (\Exception $e) {
            DB::rollback(); // 内側のトランザクションのロールバック
        }
    
        // 他のデータベース操作
    
        DB::commit(); // 外側のトランザクションのコミット
    } catch (\Exception $e) {
        DB::rollback(); // 外側のトランザクションのロールバック
        // エラーハンドリング
    }
    

    この例では、外側と内側の2つのトランザクションがあり、外側のトランザクションがロールバックされた場合、内側のトランザクションもロールバックされます。

データベーストランザクションは、データベース操作を安全に実行し、エラー時にデータの整合性を保つために非常に重要です。Laravelのトランザクション機能を使用することで、トランザクションの制御が簡単に行えます。

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?