ThinkPHP如何从数据库中取出数据,复制遍历修改后重新插入数据库中

105次阅读

共计 1209 个字符,预计需要花费 4 分钟才能阅读完成。

最近在做账单功能,需求是一键创建账单,创建时选择要复制数据的月份,即复制一份上月的数据稍作调整后作为本月或者任意月的数据。

这就需要从数据库中取出数据,修改后再插入数据库中,实际操作是发现一些问题,这里做一下总结。

一、取出数据

1、静态方法

静态方法取出的数据是对象,object,能做修改调整,但是重新插入数据库就会繁琐一些。

2、DB 类

直接引用 THINK 的 DB 类,操作数据库,得到的是数组,这样不光能方便操作,也能快速的写回数据库中。

二、修改数据

1、通过 THINKPHP 分页后数据处理修改

如果被修改的值是静态值,可以试试 分页后数据处理(V5.0.9)

V5.0.9 版本开始 支持分页类后数据直接 each 遍历处理,方便修改分页后的数据,而不是只能通过模型的获取器来补充字段。

1
2
3
$list = User::where(‘status’,1)->paginate()->each(function($item, $key){
    $item->nickname = ‘think’;
});

如果是 Db 类操作分页数据的话,each 方法的闭包函数中需要使用返回值,例如:

1
2
3
4
$list = Db::name(‘user’)->where(‘status’,1)->paginate()->each(function($item, $key){
    $item[‘nickname’] = ‘think’;
    return $item;
});

注意,一般的变量是无法传入 paginate()->each 方法,如果需要传入动态值,如要根据实际情况调整。

2、修改器

修改器的作用是在模型对象数据写入数据库之前进行一些必要的数据处理,修改器的标准定义如下:

1
2
3
4
5
6
public function setFieldNameAttr($value, $data)
{
    // 对 value 值进行处理 data 参数是当前全部数据
    // 返回值就是实际要写入数据库的值
    return $value;
}

其中 FieldName 对应数据表的 field_name 字段(注意数据表字段的规范和修改器方法定义规范,否则会导致错误)。

正文完
 0