見出し画像

Laravel 学習記録 #006 カスタムコレクションを学ぶ

Laravelのカスタムコレクションについて学習したものをまとめてます。

カスタムコレクションとは?

  • Modelを拡張できる機能

  • 通常のCollectionの代わりに独自のやつ

  • 使うにはModelでnewCollectionメソッドを定義する

特定の条件に基づいてデータをフィルタリングしたり、
データを変換したりするカスタムメソッドを定義できるってことらしい。

カスタムコレクションの使い方


Model(Teamモデル作成)
①Collectionクラスを定義したカスタムコレクションクラスを作成
②newCollectionメソッドで作成したカスタムコレクションを使う
とすることで、①で作成のメソッド(ここではfieldsメソッド)を使えるようになります。フィルター系の関数とか用意しておくと便利かも。

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;

class Team extends Model
{
    use HasFactory;

    // ②カスタムコレクションを使う
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

// ①カスタムコレクション
class CustomCollection extends Collection
{
    // フィールドを取得するメソッド
    public function fields()
    {
        $item = $this->first();
        return array_keys($item->toArray());
    }
}

コントローラー(ModelTestController)
カスタムコレクションで定義したfieldsメソッドを呼び出します。
モデルのデータを取得し、取得データに対してメソッドを呼び出す流れです。Team::get()->fields();

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Team;

class ModelTestController extends Controller
{
    public function index() {
        // カスタムコレクションでフィールド名を取得するメソッドを追加したので使う
        dd(Team::get()->fields()); 
    }
}

結果
こんな感じで、フィールド名を取得できます。

array:4 [▼ // app/Http/Controllers/ModelTestController.php:12
  0 => "id"
  1 => "team_name"
  2 => "created_at"
  3 => "updated_at"
]


なるほど。
独自のメソッドを定義するみたいに、カスタムコレクションで定義することで、ビジネスロジックをカプセル化できる機能なんですね。
あくまで取得時のみの操作なので、登録、更新、削除などは独自メソッドでカプセル化かなぁ。


この記事が気に入ったらサポートをしてみませんか?