你可以在 Eloquent 中使用 NULL 過濾,但是你不能用 NULL 過濾 集合 - 你應(yīng)該換成空字符串過濾,字段中已經(jīng)沒有 “null”。(意思是全字符串的形式的過濾不能使用 NULL,因?yàn)闀?huì)被格式化為 [“field is null”, “=”, true])。
// ORM 這樣查詢沒問題
$messages = Message::where('read_at is null')->get();
// 這將不會(huì)按預(yù)期返回,只會(huì)返回 0 條
$messages = Message::all();
$unread_messages = $messages->where('read_at is null')->count();
// 可以改成這樣
$unread_messages = $messages->where('read_at', '')->count();
如果你想對結(jié)果分組,且分組字段不對應(yīng)數(shù)據(jù)庫中的字段,你可以提供一個(gè)回調(diào)函數(shù)來返回自定義的分組字段。
例如,通過用戶的注冊日分組,代碼如下:
$users = User::all()->groupBy(function($item) {
return $item->created_at->format('Y-m-d');
});
?? 注意:這個(gè)方法是在 Collection
類上的,所以將會(huì)在數(shù)據(jù)庫的返回結(jié)果上執(zhí)行 (意思不會(huì)在數(shù)據(jù)庫 sql 層面分組)。
你可以用 ->all()
, ->get()
方法查詢數(shù)據(jù),然后在這個(gè)返回的集合上執(zhí)行各種集合方法,執(zhí)行集合操作不會(huì)每次都查詢數(shù)據(jù)庫。
$users = User::all();
echo 'Max ID: ' . $users->max('id');
echo 'Average age: ' . $users->avg('age');
echo 'Total budget: ' . $users->sum('budget');
如何對分頁返回的結(jié)果集求和?使用相同的查詢構(gòu)建器,在分頁查詢之前執(zhí)行求和操作。
// 如何通過分頁集合獲取 post_views 的總和?
$posts = Post::paginate(10);
// 這里的求和只是當(dāng)前頁的,不是總的
$sum = $posts->sum('post_views');
// 使用查詢構(gòu)建器
$query = Post::query();
// 計(jì)算總和
$sum = $query->sum('post_views');
// 然后使用相同的查詢構(gòu)建器獲取分頁數(shù)據(jù)
$posts = $query->paginate(10);
我們可以在分頁組件中像序列號那樣使用每趟循環(huán)中的索引 index
,作為分頁組件的唯一標(biāo)識。
...
<th>連續(xù)的</th>
...
@foreach ($products as $product)
<tr>
<td>{{ $loop->index + $product->firstItem() }}</td>
...
@endforeach
這可以解決下一頁(?page=2&…)索引的計(jì)數(shù)問題。
集合具有更高階的可以鏈?zhǔn)秸{(diào)用的方法,例如 groupBy()
, map()
等,給你流暢的語法體驗(yàn)。下面的例子計(jì)算了一個(gè)需求單中每組產(chǎn)品的價(jià)格。
$offer = [
'name' => '需求單1',
'lines' => [
['group' => 1, 'price' => 10],
['group' => 1, 'price' => 20],
['group' => 2, 'price' => 30],
['group' => 2, 'price' => 40],
['group' => 3, 'price' => 50],
['group' => 3, 'price' => 60]
]
];
$totalPerGroup = collect($offer['lines'])->groupBy('group')->map(fn($group) => $group->sum('price'));
更多建議: