在使用 Laravel Eloquent
模型查詢時,
$result = Model::where(...)->get()
你不能簡單地通過以下方式判斷結果集為空
if (empty($result)) { }
if (!$result) { }
if ($result) { }
因為如果你使用 dd($result);
會發(fā)現(xiàn)不論如何 ->get()
方法總是返回一個 Illuminate\Database\Eloquent\Collection
的實例渐尿,即使結果集為空。本質(zhì)上无蜂,你的判斷語句等價于 $a = new stdClass; if ($a) { ... }
苟翻,這個判斷永遠返回真值。
你可以在查詢中通過使用 ->first()
代替 ->get()
袒炉,結果將返回第一個 Model
實例或者 null
疙赠。這在你只需要一個結果時很有用付材。
$result = Model::where(...)->first();
if ($result) { ... }
Notes / References
-
->first()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_first -
->isEmpty()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_isEmpty -
->count()
http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count -
count($result)
works because the Collection implements Countable and an internalcount()
method: http://laravel.com/api/4.2/Illuminate/Database/Eloquent/Collection.html#method_count
補充
初接觸 Laravel
的人可能會對 Collection
和 Query Builder
之間的區(qū)別感到些許困惑,因為兩者有很多同名的方法圃阳,很多人也因此有時候不知道自己面對的是哪一個類厌衔。Query Builder
本質(zhì)上構造了一個查詢,直到你執(zhí)行了某一個方法(比如 ->all()
->first()
->lists()
或者其他一些方法)捍岳,它才會連接數(shù)據(jù)庫執(zhí)行該查詢富寿。這些方法同樣存在于 Collection
的實例中,可以從查詢結果中返回數(shù)據(jù)锣夹。如果你不確定自己正在面對哪一個類的實例页徐,可以嘗試 var_dump(User::all())
或者 get_class(...)
來試驗真正返回的類是哪一個。我非常非常建議你查看 Collection
類的源碼晕城,它真的很簡單泞坦。然后查看 Query Builder
的源碼,找出哪些同名方法看看它在什么時候連接數(shù)據(jù)庫進行查詢砖顷。
轉自
https://www.cnblogs.com/zhangwei595806165/p/5831539.html
https://douyasi.com/laravel/eloquent_collection_detect_empty.html
翻譯自
https://stackoverflow.com/questions/20563166/eloquent-collection-counting-and-detect-empty