Laravel 編碼技巧 集合

2023-02-16 17:10 更新

不要在集合中使用 NULL 過濾

你可以在 Eloquent 中使用 NULL 過濾,但是你不能用 NULL 過濾 集合 - 你應(yīng)該換成空字符串過濾,字段中已經(jīng)沒有 “null”。(意思是全字符串的形式的過濾不能使用 NULL,因為會被格式化為 [“field is null”, “=”, true])。

// ORM 這樣查詢沒問題
$messages = Message::where('read_at is null')->get();

// 這將不會按預(yù)期返回,只會返回 0 條
$messages = Message::all();
$unread_messages = $messages->where('read_at is null')->count();

// 可以改成這樣
$unread_messages = $messages->where('read_at', '')->count();

使用自定義的回調(diào)函數(shù)對集合分組

如果你想對結(jié)果分組,且分組字段不對應(yīng)數(shù)據(jù)庫中的字段,你可以提供一個回調(diào)函數(shù)來返回自定義的分組字段。

例如,通過用戶的注冊日分組,代碼如下:

$users = User::all()->groupBy(function($item) {
    return $item->created_at->format('Y-m-d');
});

?? 注意:這個方法是在 Collection 類上的,所以將會在數(shù)據(jù)庫的返回結(jié)果上執(zhí)行 (意思不會在數(shù)據(jù)庫 sql 層面分組)。

針對行的集合方法

你可以用 ->all() , ->get() 方法查詢數(shù)據(jù),然后在這個返回的集合上執(zhí)行各種集合方法,執(zhí)行集合操作不會每次都查詢數(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();
// 計算總和
$sum = $query->sum('post_views');
// 然后使用相同的查詢構(gòu)建器獲取分頁數(shù)據(jù)
$posts = $query->paginate(10);

分頁組件中的唯一標(biāo)識

我們可以在分頁組件中像序列號那樣使用每趟循環(huán)中的索引 index ,作為分頁組件的唯一標(biāo)識。

   ...
   <th>連續(xù)的</th>
    ...
    @foreach ($products as $product)
    <tr>
        <td>{{ $loop->index + $product->firstItem() }}</td>
        ...
    @endforeach

這可以解決下一頁(?page=2&…)索引的計數(shù)問題。

高階集合方法

集合具有更高階的可以鏈?zhǔn)秸{(diào)用的方法,例如 groupBy() , map() 等,給你流暢的語法體驗。下面的例子計算了一個需求單中每組產(chǎn)品的價格。

$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'));


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號