Laravel Collection Where使用上の注意事項

5375 ワード

Laravelのcollection機能は非常に強力で使いやすく、whereは最もよく使われる関数の一つです.
まず公式サイトの使い方を見てみましょう.
$collection = collect([
    ['product' => 'Desk', 'price' => 200],
    ['product' => 'Chair', 'price' => 100],
    ['product' => 'Bookcase', 'price' => 150],
    ['product' => 'Door', 'price' => 100],
]);

$filtered = $collection->where('price', 100);

$filtered->all();

/*
[
    ['product' => 'Chair', 'price' => 100],
    ['product' => 'Door', 'price' => 100],
]
*/

whereは元の配列要素のkey=>valueを返します.
しかしeloquentクエリの結果については,通常valueのみに注目しているが,この場合keyは注意しないと副作用をもたらす可能性がある.
たとえば、json apiを構築するときに次のようなデータを返すと、1つの要素しかないidle_infoに対してkeyが追加保存されobjectになり、2つ以上の要素がない場合はarrayとして正常に表示されるという問題が発生する可能性があります.
{
  "message": "    !",
  "data": [
    {
      "id": 1,
      "code": "officiis",
      "name": "omnis",
      "name_en": "exercitationem",
      "remark": null,
      "idle_info": []
    },
    {
      "id": 2,
      "code": "distinctio",
      "name": "velit",
      "name_en": "placeat",
      "remark": null,
      "idle_info": [  //      
        {
          "id": 17,
          "dye_factory_id": 1,
          "dye_factory_name": "maiores",
          "machine_type_id": 2,
          "machine_type_name": "ut",
          "year": 2017,
          "month": 2,
          "idle_capacity": 190,
          "dye_factory": {
            "id": 1,
            "code": "eum",
            "name": "pariatur",
            "name_en": "quo",
            "type_id": 2,
            "province_id": 8,
            "city_id": 8,
            "town_id": 2,
            "product_type_id": 4,
            "contact": "debitis",
            "address": "consequatur",
            "delivery_address": "dolorem",
            "remark": null,
            "is_checked": 0,
            "last_check_date": "1980-11-24 00:00:00"
          }
        },
        {
          "id": 31,
          "dye_factory_id": 1,
          "dye_factory_name": "consequatur",
          "machine_type_id": 2,
          "machine_type_name": "et",
          "year": 2017,
          "month": 2,
          "idle_capacity": 21328.162,
          "dye_factory": {
            "id": 1,
            "code": "eum",
            "name": "pariatur",
            "name_en": "quo",
            "type_id": 2,
            "province_id": 8,
            "city_id": 8,
            "town_id": 2,
            "product_type_id": 4,
            "contact": "debitis",
            "address": "consequatur",
            "delivery_address": "dolorem",
            "remark": null,
            "is_checked": 0,
            "last_check_date": "1980-11-24 00:00:00"
          }
        }
      ]
    },
    {
      "id": 3,
      "code": "voluptatem",
      "name": "iure",
      "name_en": "voluptatem",
      "remark": null,
      "idle_info": []  //      
    },
    {
      "id": 10,
      "code": "dolor",
      "name": "quibusdam",
      "name_en": "omnis",
      "remark": null,
      "idle_info": {  //    ,   key,    object
        "2": {
          "id": 23,
          "dye_factory_id": 1,
          "dye_factory_name": "facilis",
          "machine_type_id": 10,
          "machine_type_name": "non",
          "year": 2017,
          "month": 2,
          "idle_capacity": 3.1,
          "dye_factory": {
            "id": 1,
            "code": "eum",
            "name": "pariatur",
            "name_en": "quo",
            "type_id": 2,
            "province_id": 8,
            "city_id": 8,
            "town_id": 2,
            "product_type_id": 4,
            "contact": "debitis",
            "address": "consequatur",
            "delivery_address": "dolorem",
            "remark": null,
            "is_checked": 0,
            "last_check_date": "1980-11-24 00:00:00"
          }
        }
      }
    }
  ]
}

解決策:value値のみを保持
//$item['idle_info'] = $capacities->where('machine_type_id', $item->id);

$item['idle_info'] = array_values($capacities->where('machine_type_id', $item->id)->toArray());