Skip to content

Laravel 集合使用技巧

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

PHP作为弱类型语言,数组非常简单好用,没有像Java、Go语言那么多的限制;而PHP的集合除了简单好用,相比数组支持更强大的功能。

集合

高阶集合方法

集合具有更高阶的可以链式调用的方法,例如 groupBy() , map() 等

下面的例子计算了一个订单中每组产品的价格。

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

不要在集合中使用 NULL 过滤

我们可以在 Eloquent 中使用 NULL 过滤,但是不能用 NULL 过滤 集合

需要换成空字符串过滤,字段中已经没有 "null"。

原理是全字符串的形式的过滤不能使用 NULL,因为会被格式化为 ["field is null", "=", true]

ini
// ORM 这样查询没问题 $products = Product::where('purchase_at is null')->get(); // 这将不会按预期返回,只会返回 0 条 $products = Product::all(); $unpurchase_products = $products->where('purchase_at is null')->count(); // 可以改成这样 $unpurchase_products = $products->where('purchase_at', '')->count();

使用自定义的回调函数对集合分组

如果我们想对结果分组,且分组字段不对应数据库中的字段

我们可以提供一个回调函数来返回自定义的分组字段。

例如,通过用户的注册日分组,代码如下:

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

⚠️ 注意:这个方法是在 Collection 类上的,所以将会在数据库的返回结果上执行。(意思不会在数据库 sql 层面分组)

针对行的集合方法

可以用 ->all() , ->get() 方法查询数据,然后在这个返回的集合上执行各种集合方法,执行集合操作不会每次都查询数据库。

bash
$users = User::all(); echo 'Max ID: ' . $users->max('id'); echo 'Average age: ' . $users->avg('age'); echo 'Total budget: ' . $users->sum('budget');

对分页集合求和

如何对分页返回的结果集求和?使用相同的查询构建器,在分页查询之前执行求和操作。

ini
// 如何通过分页集合获取 post_views 的总和? $posts = Post::paginate(10); // 这里的求和只是当前页的,不是总的 $sum = $posts->sum('post_views'); // 使用查询构建器 $query = Post::query(); // 计算总和 $sum = $query->sum('post_views'); // 然后使用相同的查询构建器获取分页数据 $posts = $query->paginate(10);

分页组件中的唯一标识

我们可以在分页组件中像序列号那样使用每趟循环中的索引 index ,作为分页组件的唯一标识。

bash
...    <th>连续的</th>     ...     @foreach ($products as $product)     <tr>         <td>{{ $loop->index + $product->firstItem() }}</td>         ...     @endforeach

这可以解决下一页(?page=2&...)索引的计数问题。

Last but not least

技术交流群请到 这里来。 或者添加我的微信 wangzhongyang0601 ,一起学习。

感谢大家的点赞、评论、关注,谢谢大佬们的支持,感谢。

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情