tp5 分页后,修改数据 ( 2 )
为什么说这是2呢,因为之前我有写过一篇 同样是tp5分页后的数据修改的文章,请参考 https://blog.csdn.net/Alencai/article/details/84570139
这次是采用了更加简便的方法,其实具体官方文档也有,只是官方5.0有些bug,楼主在此补充说明一下。此次补充参照tp官方论坛,非楼主发现的bug。
描述
看过之前写的那一篇的都知道,那种方法是采用 将paginate() 之后的数据 转成数组赋值给一个新的数组,然后foreach 这个新数组来修改,这样修改起来篇幅比较长,而且不好理解。所以还是老实使用官方的each来修改, 注意,tp5.0 的each 循环有bug,并不能实际修改或增加 paginate 分页后的对象数据,所以:
第一步:找到 \thinkphp\library\think\Collection.php 下面定义的 each 方法
/**
* 给每个元素执行个回调
*
* @param callable $callback
* @return $this
*/
public function each(callable $callback)
{
foreach ($this->items as $key => $item) {
if ($callback($item, $key) === false) {
break;
}
}
return $this;
}
修改之后
/**
* 给每个元素执行个回调
* @param callable $callback
* @return $this
*/
public function each(callable $callback)
{
foreach ($this->items as $key => $item) {
$this->items[$key] = $callback($item, $key); // 修改之处
if ($callback($item, $key) === false) {
break;
}
}
return $this;
}
第二步:分页处调用(应该是 tp5.1之后each()便是修正了的,5.1以上的自动忽略第一步,如果修改或者增加失败的,请检查each())
$list = db('user')->paginate(20,false,['query'=>request()->param()])
->each(function($item, $key){
// 可做其他数据库查询数据来修改 item
$item['age'] = 18;
return $item;
});
$this->assign("list",$list->all());
其实paginate分页数据修改起来还是很方便的,多点参考文档和论坛,你会成长的更快。