You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:28