Laravel Collection Where使用上の注意事項
5375 ワード
Laravelのcollection機能は非常に強力で使いやすく、whereは最もよく使われる関数の一つです.
まず公式サイトの使い方を見てみましょう.
whereは元の配列要素のkey=>valueを返します.
しかしeloquentクエリの結果については,通常valueのみに注目しているが,この場合keyは注意しないと副作用をもたらす可能性がある.
たとえば、json apiを構築するときに次のようなデータを返すと、1つの要素しかないidle_infoに対してkeyが追加保存されobjectになり、2つ以上の要素がない場合はarrayとして正常に表示されるという問題が発生する可能性があります.
解決策:value値のみを保持
まず公式サイトの使い方を見てみましょう.
$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());