Phalcon 4 中如何对CompanyProduct表执行批量增删改操作?
问题解答
关联同步实现方案
没有办法通过单条SQL指令完成该公司所有关联产品的增删改同步操作,你提到的「开启事务→删除该公司所有旧关联→批量插入新关联→提交事务」是这类多对多关联同步场景的标准实现方案,完全可用。
因为你的表存在外键约束,事务可以保证所有操作的原子性:要么全部执行成功完成关联更新,要么全部回滚回到操作前的状态,不会出现中间状态触发外键校验报错,也不会产生部分关联更新成功、部分失败的脏数据。
批量插入实现方案
不需要循环调用单条插入方法,你可以构造单条批量INSERT语句一次性完成所有关联记录的插入,执行效率远高于循环单条插入,Phalcon 4下的实现参考代码如下:
$companyId = 123; $productIds = [1,3,4,5,6,7,8]; $placeholders = []; $params = []; foreach ($productIds as $idx => $productId) { $placeholders[] = "(:companyId{$idx}:, :productId{$idx}:)"; $params["companyId{$idx}"] = $companyId; $params["productId{$idx}"] = $productId; } $insertQuery = sprintf( 'INSERT INTO CompanyProduct (companyId, productId) VALUES %s', implode(',', $placeholders) ); $this->modelsManager->executeQuery($insertQuery, $params);
可选优化方案
如果该公司的关联产品数据量很大,你也可以先查询出当前数据库中该公司已关联的productId数组,和前端传的productIds做对比,仅删除需要移除的关联、插入需要新增的关联,不需要全量删除再插入,能进一步减少数据库操作的开销。
内容的提问来源于stack exchange,提问作者Luca95
相关产品推荐
相关产品推荐

