<p>以下是我和chatgpt最终对话</p><p>问:thinkphp6使用insertGetId插入数据,如何过滤不存在的字段,刚才测试使用allowField报fields not exists:[file],没有过滤成功,据我所知道,只有save方法才能应用allowField方法,还有其他解决方法吗<br/></p><p>chatgpt答:</p><p>确实,`allowField` 方法通常用于 `save`、 `saveAll` 等会写入数据库的操作中。如果直接使用 `insertGetId` 方法且存在未在数据表中定义的字段,则无法使用 `allowField` 方法进行字段过滤。
不过还有一种方法可以实现字段过滤,即对 `$data` 数组进行处理,移除 `$data` 中不存在的字段,然后再使用 `insertGetId` 方法。
示例代码:</p><pre style="box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: var(--jp-code-font-family); font-size: var(--jp-code-font-size); margin-top: 0px; margin-bottom: 0px; overflow: auto; line-height: var(--jp-code-line-height); color: var(--jp-content-font-color1); border: none; padding: 0px; word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; background-color: rgb(255, 255, 255);" class="brush:php;toolbar:false;">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);</pre><p>在上述代码中,使用 `array_flip` 将字段数组的键值翻转,使其成为数组的值,然后使用 `array_intersect_key` 函数只保留 `$data` 数组与 `$fields` 数组中的交集,从而实现了对字段的过滤。<br/><br/>最终我的实际解决方法:</p><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'JetBrains Mono',monospace;font-size:9.8pt;"><span style="color:#9876aa;background-color:#232525;">$crmClientOrderModel</span><span style="background-color:#232525;">=</span><span style="color:#cc7832;background-color:#232525;">new </span><span style="color:#72737a;background-color:#232525;">\app\admin\model\</span><span style="background-color:#232525;">CrmClientOrder()</span><span style="color:#cc7832;background-color:#232525;">;<br/></span><span style="color:#808080;background-color:#232525;">//$crmClientOrderModel->getTableFields() </span><span style="color:#808080;background-color:#232525;font-family:'宋体',monospace;">获取表字段<br/></span><span style="color:#808080;background-color:#232525;font-family:'宋体',monospace;"> </span><span style="color:#9876aa;background-color:#232525;">$data</span><span style="background-color:#232525;">=array_intersect_key(</span><span style="color:#9876aa;background-color:#232525;">$data</span><span style="color:#cc7832;background-color:#232525;">, </span><span style="background-color:#232525;">array_flip(</span><span style="color:#9876aa;background-color:#232525;">$crmClientOrderModel</span><span style="background-color:#232525;">-></span><span style="color:#ffc66d;background-color:#232525;">getTableFields</span><span style="background-color:#232525;">()))</span><span style="color:#cc7832;background-color:#232525;">;<br/></span><span style="color:#9876aa;background-color:#232525;">$id</span><span style="background-color:#232525;">=</span><span style="color:#9876aa;background-color:#232525;">$crmClientOrderModel</span><span style="background-color:#232525;">-></span><span style="color:#ffc66d;background-color:#232525;">insertGetId</span><span style="background-color:#232525;">(</span><span style="color:#9876aa;background-color:#232525;">$data</span><span style="background-color:#232525;">)</span><span style="color:#cc7832;background-color:#232525;">;</span></pre><p><br/></p>
相关文章