2

make、model、fueltype の 3 つのパラメーターを使用する検索関数を作成しています。「make」パラメーターは必須であるため、まず以下のコードを使用して、make とそれに関連するモデルをコレクションに選択します。


// Find Make and Models
$makeAndModels = Make::where('name', $request->make)->with('carmodels', 'carmodels.fueltype')->first();

この時点で、コレクションは次のようになります。

{
    "id": 2,
    "name": "Toyota",
    "created_at": "2020-07-26T16:11:06.000000Z",
    "updated_at": "2020-07-26T16:11:06.000000Z",
    "carmodels": [
        {
            "id": 3,
            "name": "Prius",
            "make_id": 2,
            "fueltype_id": 2,
            "created_at": "2020-07-26T16:44:21.000000Z",
            "updated_at": "2020-07-26T16:44:21.000000Z",
            "fueltype": {
                "id": 2,
                "name": "Hybrid",
                "created_at": "2020-07-26T16:11:06.000000Z",
                "updated_at": "2020-07-26T16:11:06.000000Z"
            }
        },
        {
            "id": 4,
            "name": "Hilux",
            "make_id": 2,
            "fueltype_id": 3,
            "created_at": "2020-07-26T16:44:21.000000Z",
            "updated_at": "2020-07-26T16:44:21.000000Z",
            "fueltype": {
                "id": 3,
                "name": "Diesel",
                "created_at": "2020-07-26T16:11:06.000000Z",
                "updated_at": "2020-07-26T16:11:06.000000Z"
            }
        }
    ]
}

次に、'carmodels' 子コレクションを名前と燃料タイプでフィルター処理し、フィルター処理されたデータを新しいコレクションではなく、元の自己に戻します。これらのフィルターは、追加のパラメーターが提供されている場合にのみ実行する必要があります。現在使用しているコードは次のようになります。

        //Filter Models By Additional Parameters

            //Model
            if ($request->model) {
                $model = $request->model;
                $makeAndModels->carmodels = $makeAndModels->carmodels->filter()->where('name', $model);
            }

何らかの理由で、この方法でフィルタリングしても元のコレクションは上書きされません。たとえば、新しい子コレクションにフィルタリングすると、

        //Filter Models By Additional Paramters

            //Model
            if ($request->model) {
                $model = $request->model;
                $makeAndModels->carmodelsFiltered = $makeAndModels->carmodels->filter()->where('name', $model);
            }

次の結果が生成されるため、フィルターが機能するはずです。

{
    "id": 2,
    "name": "Toyota",
    "created_at": "2020-07-26T16:11:06.000000Z",
    "updated_at": "2020-07-26T16:11:06.000000Z",
    "carmodelsFiltered": [
        {
            "id": 3,
            "name": "Prius",
            "make_id": 2,
            "fueltype_id": 2,
            "created_at": "2020-07-26T16:44:21.000000Z",
            "updated_at": "2020-07-26T16:44:21.000000Z",
            "fueltype": {
                "id": 2,
                "name": "Hybrid",
                "created_at": "2020-07-26T16:11:06.000000Z",
                "updated_at": "2020-07-26T16:11:06.000000Z"
            }
        }
    ],
    "carmodels": [
        {
            "id": 3,
            "name": "Prius",
            "make_id": 2,
            "fueltype_id": 2,
            "created_at": "2020-07-26T16:44:21.000000Z",
            "updated_at": "2020-07-26T16:44:21.000000Z",
            "fueltype": {
                "id": 2,
                "name": "Hybrid",
                "created_at": "2020-07-26T16:11:06.000000Z",
                "updated_at": "2020-07-26T16:11:06.000000Z"
            }
        },
        {
            "id": 4,
            "name": "Hilux",
            "make_id": 2,
            "fueltype_id": 3,
            "created_at": "2020-07-26T16:44:21.000000Z",
            "updated_at": "2020-07-26T16:44:21.000000Z",
            "fueltype": {
                "id": 3,
                "name": "Diesel",
                "created_at": "2020-07-26T16:11:06.000000Z",
                "updated_at": "2020-07-26T16:11:06.000000Z"
            }
        }
    ]
}

新しいコレクションを作成せずにコレクションの子コレクションをフィルタリングする方法を知っている人はいますか? 前もって感謝します。

4

1 に答える 1