在前天前後端不分離的畫面,使用者創建完團購(Group)後,會直接轉址到輸入產品資料的空白表單,在這個畫面我一次提供了10筆可供填寫的列,每一列可填入一筆產品資料
(先不管使用者可能需要填寫超過10項產品的情況…)
假設使用者只填寫四筆,傳入 controller 的資料會像下圖,第四筆開始內容都是 null
如果直接將傳入資料新增至資料庫,就會碰觸到有些欄位不可為 null 的限制,我也不想要有資料全部都是 null ,所以就需要「處理」一下這些資料。
這裡用 tinker 2 這個軟體,可直接當成 php artisan tinker 的視窗,也可以測試 php code,還可以編輯左邊訊息,非常方便(但現在沒有繼續維護了有點可惜,好像也不太能下載了,可以研究看看其他軟體)
array_filter()
是 PHP 中的一個內建函數,array_filter
就像一個過濾器,它可以幫助你過濾掉陣列中不需要的元素,只保留符合特定條件的元素。
上面的程式碼可用閉包改寫:
$newArray = array_filter($array, function($value) {
return $value % 3 == 0;
// 當 ($value % 3 == 0) 這個條件被滿足時才會回傳
});
我需要被整理的資料如下,其中有兩個條件:
因此,我需要把所有 product_name = null
的 array 元素整筆刪除,使用 array_filter() 加上閉包:
$data = [
1 => [
"product_name" => "章魚燒披薩",
"price" => "350",
"quantity_limit" => null,
"note" => null,
],
2 => [
"product_name" => "總匯披薩",
"price" => "500",
"quantity_limit" => null,
"note" => null,
],
3 => [
"product_name" => "瑪格麗特",
"price" => "390",
"quantity_limit" => null,
"note" => null,
],
4 => [
"product_name" => null,
"price" => null,
"quantity_limit" => null,
"note" => null,
],
5 => [
"product_name" => null,
"price" => null,
"quantity_limit" => null,
"note" => null,
],
6 => [
"product_name" => null,
"price" => null,
"quantity_limit" => null,
"note" => null,
],
];
溫馨提醒,這裡講的是
Illuminate\Support\Collection
,跟處理回傳結果的Illuminate\Database\Eloquent\Collection
是不同東西!
Eloquent\Collection 是繼承 Illuminate\Support\Collection 的用法。
Laravel 的 Collection
是一個強大的資料集合工具,就像一個超級方便的工具包,它讓你可以更輕鬆地處理數據,就像在一個資料庫中查詢數據一樣。它的主要功能就是幫助你對數據集進行各種操作,比如過濾、排序、轉換、計算等等,而不需要寫很多冗長的程式碼。
以簡單的方式來看,你可以把 Laravel Collection 想像成一個神奇的魔法盒子,你把一堆資料扔進去,然後透過不同的指令(方法)來取出你需要的東西。比如,你可以對一組商品進行篩選,只保留某些特定條件下的商品;或者你可以把數據集按照不同的規則排序;又或者你可以對每一個數據進行轉換,生成新的數據。
Collection
類別能讓你將其方法串在一起呼叫,以流暢地在底層的陣列上進行 Map 與 Reduce 處理。Collection
方法都會回傳一個全新的 Collection
實體。以上面相同舉例來看,經過 collect()
之後的 array 會變成 Laravel Collection 物件
,就可以用 →
指向各種方便的方法使用
傳入的資料 $inputData
// 傳入的資料
$inputData = [
[
"product_name" => "章魚燒披薩",
"price" => "350",
"quantity_limit" => null,
"note" => null,
],
[
"product_name" => "總匯披薩",
"price" => "500",
"quantity_limit" => null,
"note" => null,
],
[
"product_name" => "瑪格麗特",
"price" => "390",
"quantity_limit" => null,
"note" => null,
],
// 這裡省略了其餘商品的資料
];
修改處理資料的邏輯
// 原本的寫法:array_filter()
$productsData = array_filter($inputData, function ($data) {
return isset($data['product_name']);
// 如果 product_name 有值的話才被回傳
});
// 改用 laravel collection
$collectArray = collect($inputData);
// 將 array 轉換為 collection 物件
$productsData = $collectArray->whereNotNull('product_name');
// 如果 product_name 不是 null 的話存入 $productsData