Laravel Collection 判斷是否為空:empty() 與 isEmpty() 的差異

Laravel Collection 判斷是否為空的差異:empty() vs isEmpty()

在 Laravel 中,當我們使用 get()collect() 建立一個集合(Collection)時,即使裡面沒有任何元素,回傳的也會是一個 Collection 物件
這就造成一個常見的誤會:為什麼明明查不到資料,用 empty() 判斷卻不會是空的?


為什麼 empty() 無效?

在 PHP 中,empty() 判斷的是「變數是否為空值」,例如 nullfalse0、空字串 ''、或空陣列 []
但是 物件不是空值,就算裡面沒有任何資料,empty($object) 仍然會回傳 false

1
2
3
4
5
$tasks = collect([]);
var_dump(empty($tasks)); // false,因為 $tasks 是一個物件

$tasks = Task::query()->where('id', 0)->get();
var_dump(empty($tasks)); // false,因為 $tasks_2 也是一個物件

正確做法:使用 isEmpty()

Laravel 的 Collection 提供了 isEmpty() 方法,可以正確判斷集合內是否沒有元素。

1
2
3
4
5
6
7
$tasks = Task::query()->where('id', 0)->get();

if ($tasks->isEmpty()) {
echo '沒有資料';
} else {
echo '有資料';
}

範例比較

1
2
3
4
5
6
7
8
9
$emptyArray = [];
$emptyCollection = collect([]);

// 陣列
var_dump(empty($emptyArray)); // true

// Collection 物件
var_dump(empty($emptyCollection)); // false
var_dump($emptyCollection->isEmpty()); // true