在之前控制器向前段传值的时候($this->assign()),一直讲模型取得的数据集通过toArray方法转为数组,结果丢失了最好用的方法,向前段传collection数据对象可以使用model中的方法。 如下: Model A 一对多 关联 Model B 模型A 的关联 b ,这个可以在前段直接取到b
public function b(){
return $this->hasMany(B::Class,’a_id’,’id’);
}
$ac=A::select();
前段传入$ac <volist name=”ac” id=”vo”>
此处已经加载到内存,不会多加SQL查询
<p>{:count($vo->b->where(‘date’,’2025-01-21′))}</p>
<p>{:$vo->b->where(‘date’,’2025-01-21′)->count()}</p> collection自带到统计方法 下面的回影响性能,多查询 <p>{:$vo->b()->where(‘date’, ‘2025-01-21’)->count()}</p>
</volist>
Collection 数据对象
一、基础统计 / 判断方法(最常用)
方法 作用 示例(基于$vo->b这个 Collection) count()统计集合元素数量(替代 PHP 原生count()) $vo->b->count() // 统计所有 B 数据isEmpty()判断集合是否为空 $vo->b->isEmpty() // 返回 true/falseisNotEmpty()判断集合是否非空(反向isEmpty()) $vo->b->isNotEmpty()max('字段名')获取指定字段的最大值 $vo->b->max('price') // 取 B 表 price 最大值min('字段名')获取指定字段的最小值 $vo->b->min('price')sum('字段名')计算指定字段的总和 $vo->b->sum('amount') // 统计 B 表 amount 字段总和avg('字段名')计算指定字段的平均值 $vo->b->avg('score')
二、筛选 / 查找方法(模板中筛选数据常用)
方法 作用 示例 where('字段名', '值')筛选符合条件的元素(支持多条件) $vo->b->where('date', '2025-01-21') // 筛选 date 等于指定值的 B 数据where('字段名', '操作符', '值')带操作符的筛选(>、<、like 等) $vo->b->where('price', '>', 100) // 价格大于 100 的 B 数据whereLike('字段名', '模糊值')模糊筛选(替代 SQL 的 LIKE) $vo->b->whereLike('name', '%手机%')whereIn('字段名', [值1, 值2])筛选字段值在指定数组中的元素 $vo->b->whereIn('status', [1,2])whereNotIn('字段名', [值1, 值2])筛选字段值不在指定数组中的元素 $vo->b->whereNotIn('id', [5,6])find('主键值')根据主键查找单个元素 $vo->b->find(3) // 查找 B 表 id=3 的记录first()获取集合中第一个元素 $vo->b->where('status', 1)->first() // 取第一个状态为 1 的 B 数据last()获取集合中最后一个元素 $vo->b->last()
三、排序 / 去重方法
方法 作用 示例 order('字段名', '排序方式')对集合排序(asc/desc) $vo->b->order('create_time', 'desc') // 按创建时间降序sortBy('字段名')按字段升序排序(简化版order) $vo->b->sortBy('price')sortByDesc('字段名')按字段降序排序 $vo->b->sortByDesc('price')unique('字段名')根据指定字段去重 $vo->b->unique('category_id') // 按分类 ID 去重
四、数据提取 / 转换方法
方法 作用 示例 toArray()转为普通数组(你之前用过的方法) $vo->b->toArray() // 保留字段值,丢失模型方法all()返回集合底层的数组(等价于toArray()但更语义化) $vo->b->all()pluck('字段名')提取指定字段的值,返回新集合 $vo->b->pluck('name') // 提取所有 B 数据的 name 字段pluck('字段名', '主键名')提取字段并以主键为键名 $vo->b->pluck('name', 'id') // 得到 [id=>name] 的集合column('字段名')等同于pluck(),兼容 PHP 原生array_column $vo->b->column('price')
五、遍历 / 修改方法(控制器中处理数据常用)
方法 作用 示例 each(function($item) {})遍历集合,可修改元素 $vo->b->each(function($b) { $b->price = $b->price * 0.8; }) // 所有 B 数据价格打 8 折map(function($item) {})遍历集合,返回新集合 $vo->b->map(function($b) { return $b->name; }) // 返回仅包含 name 的新集合
实战示例(模板中组合使用)
<volist name="ac" id="vo">
<!-- 1. 统计2025-01-21且价格>100的B数据数量 -->
<p>{:$vo->b->where('date', '2025-01-21')->where('price', '>', 100)->count()}</p>
<!-- 2. 获取符合条件的第一个B数据的名称 -->
<p>{:$vo->b->where('status', 1)->first()->name ?? '无数据'}</p>
<!-- 3. 计算符合条件的B数据金额总和 -->
<p>{:$vo->b->where('date', '2025-01-21')->sum('amount')}</p>
<!-- 4. 提取所有B数据的ID,转为逗号分隔的字符串 -->
<p>{:$vo->b->pluck('id')->implode(',')}</p>
</volist>