Thinkphp中 前段使用collection

在之前控制器向前段传值的时候($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>

发表回复