在之前控制器向前段传值的时候($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/false |
isNotEmpty() | 判断集合是否非空(反向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>