如何在创建Campaign时传递多选Asset数据并批量插入数据库?
解决方案
1. 多选数据的传递方式
完全可以继续用raw JSON传递多选的asset类型,只需在原有JSON结构中新增一个数组类型字段(比如asset_types),将选中的所有asset类型以数组形式传入即可。
Postman中请求的JSON示例:
{ "name": "测试活动", "description": "活动描述", "status": "active", "start_date": "2024-05-01", "end_date": "2024-05-30", "discount": 15, "asset_types": ["图片", "视频", "音频"] }
2. 控制器方法重构
需要在创建Campaign后,遍历传入的asset类型数组,逐个插入到assets表,同时建议用数据库事务保证数据一致性(避免Campaign插入成功但关联资产插入失败的情况)。
重构后的代码示例:
public function createCampaign($input) { // 基础字段校验 if (empty($input->name) || empty($input->description) || empty($input->status) || empty($input->start_date) || empty($input->end_date) || empty($input->discount)) { return new ErrorModel([ 'code' => 400, 'errorDetails' => '请提供所有必填字段' ]); } // 开启数据库事务 $this->sdk()->db()->beginTransaction(); try { // 插入Campaign数据 $campaignModuleModel = new CampaignModuleModel([ 'name' => $input->name, 'description' => $input->description, 'status' => $input->status, 'start_date' => $input->start_date, 'end_date' => $input->end_date, 'discount' => $input->discount ]); $campaignCreated = $this->sdk()->db()->insert($campaignModuleModel); if (!$campaignCreated) { throw new Exception('创建活动失败'); } // 获取刚插入的Campaign ID(根据你的ORM/DB工具调整获取方式) $campaignId = $campaignModuleModel->id; // 假设模型插入后自动填充主键ID // 处理资产类型插入(如果传入了asset_types) if (!empty($input->asset_types) && is_array($input->asset_types)) { foreach ($input->asset_types as $assetType) { // 实例化Asset模型(需提前定义对应assets表的模型) $assetModel = new AssetModel([ 'campaign_id' => $campaignId, 'asset_type' => $assetType ]); $assetInserted = $this->sdk()->db()->insert($assetModel); if (!$assetInserted) { throw new Exception('插入资产类型失败'); } } } // 提交事务 $this->sdk()->db()->commit(); // 返回创建成功的Campaign详情 return $this->sdk()->db()->select($campaignModuleModel); } catch (Exception $e) { // 回滚事务 $this->sdk()->db()->rollback(); return new ErrorModel([ 'code' => 400, 'errorDetails' => $e->getMessage() ]); } }
注意事项
- 确保已定义对应
assets表的模型(比如AssetModel),字段映射正确。 - 根据你的数据库工具/ORM调整获取Campaign主键ID的方式(部分工具会在插入后自动赋值给模型主键属性,部分需手动获取自增ID)。
- 如果asset_types是必填字段,可在基础校验中加入
empty($input->asset_types)的判断。
内容的提问来源于stack exchange,提问作者syntaX
相关产品推荐
相关产品推荐

