thinkphp6使用insertGetId插入数据,如何过滤不存在的字段

      发布在:后端技术      评论:0 条评论

以下是我和chatgpt最终对话

问:thinkphp6使用insertGetId插入数据,如何过滤不存在的字段,刚才测试使用allowField报fields not exists:[file],没有过滤成功,据我所知道,只有save方法才能应用allowField方法,还有其他解决方法吗

chatgpt答:

确实,`allowField` 方法通常用于 `save`、 `saveAll` 等会写入数据库的操作中。如果直接使用 `insertGetId` 方法且存在未在数据表中定义的字段,则无法使用 `allowField` 方法进行字段过滤。 不过还有一种方法可以实现字段过滤,即对 `$data` 数组进行处理,移除 `$data` 中不存在的字段,然后再使用 `insertGetId` 方法。 示例代码:

use app\model\User; // 假设用户模型为app\model\User

$data = [
    'username' => 'test',
    'password' => '123456',
    'email' => 'test@test.com',
    'mobile' => '123456789'
];

$fields = ['username', 'password', 'email']; // 可以手动指定存在的字段

$userModel = new User();
$insertData = array_intersect_key($data, array_flip($fields)); // 只保留存在的字段

$userModel->insertGetId($insertData);

在上述代码中,使用 `array_flip` 将字段数组的键值翻转,使其成为数组的值,然后使用 `array_intersect_key` 函数只保留 `$data` 数组与 `$fields` 数组中的交集,从而实现了对字段的过滤。

最终我的实际解决方法:

$crmClientOrderModel=new \app\admin\model\CrmClientOrder();
//$crmClientOrderModel->getTableFields() 获取表字段
   $data=array_intersect_key($data, array_flip($crmClientOrderModel->getTableFields()));
$id=$crmClientOrderModel->insertGetId($data);


相关文章
热门推荐