我正在构建Electron 商务应用程序,在保存许多变体时我一直在努力解决这个问题:

据推测,我收到了归还Collection 的请求:

let data = {     
    "_token"    :"{{ csrf_token() }}",     
    "data"  : tableToJson($(".fixed-table table"), $(".scroll-table table")), // return data
}
let res = $.post(url, data); 

结果会是这样的(在这种情况下,我使用具有最多2个选项的变体):

data = {
{
    color: black,
    size: 10,
    sku: abxc,
    quantity: 1,
    price: 100$,
    
},
{
    color: blue,
    size: 10,
    sku: abxz,
    quantity: 2,
    price: 1100$,
},
,....}

我打算在控制器中插入以下功能:

function insertVariant(Request $request) {
    $datas = $request->all();
    
    $options = new Options();
    $id = options->insertGetId(
            [
                'name'=>'$data['color'] ,
            ]
            , 
            [
                'name'=>'$data['size'] ,
            ]
        ]);

    foreach ($datas in $data) {

        $sku = new SKU();
        $sku['name'] = $data['sku'],
        $sku['price'] = $data['price'],
        $sku['quantity'] = $data['quatity']
        $sku->save();
        
        $variant_value = new VariantValue();
        $variant_value['variant_options_id'] = $id[0];
        $variant_value['value'] = $data['color'];
        $variant_value['value'] = $data['size'];
        $variant_value->save();
        
        $sku_variant_value = new SKUVariantValues();
        $sku_variant_value['variant_value_id'] = $variant_value->id;
        $sku_variant_value['sku_id'] = $sku->id;
        $sku_variant_value->save();
    }    
}

我看到这个请求返回太久,好像它成功了吗?

当以尽可能低的成本保存多个模型时,如何进行优化?

EDIT: 我使用数据库作为建议:Modeling Product Variants

推荐答案

假设:我假设所有表都有自动增量的id列(主要关键字)

参考摘自:Bulk insert and get returned ids laravel

这是我建议的代码:

function insertVariant(Request $request) {
    $datas = $request->all();

    $id = $options->insertGetId(
        [
            'name'=>'$data['color'] ,
        ]
        , 
        [
            'name'=>'$data['size'] ,
        ]
    ]); // check that $options is created and a valid object

    // 1- get the last id of your table SKU say $lastIdBeforeInsertionInSkuTable
    // 2- get the last id of your table VariantValue say $lastIdBeforeInsertionInVariantValueTable


    $skuArray = []
    $variantValueArr = [];

    foreach ($datas in $data) {    
          $sku = [
             'name' => $data['sku'],
             'price' => $data['price'],
             'quantity' => $data['quantity'],
          ];

         $skuArray[] = $sku;
         
         //Using value1 and value 2 because the same index values got over-written, so check and fix it at your end
         $variantValue = [
            'variant_options_id' => $id[0],
            'value1' => $data['color'],
            'value2' = $data['size'],
         ];
         $variantValueArr[] = $variantValue;
    }

    SKU::insert($skuArray);
    VariantValue::insert($variantValueArr);

    $skuIds = [];
    $variantValueIds = [];
    for($i=1; $i<=count($skuArray); $i++){
        $skuIds[] = $lastIdBeforeInsertionInSkuTable+$i;
        $variantValueIds[] = $lastIdBeforeInsertionInVariantValueTable+$i;
    }

    $skuVariantValuesArr = [];
    foreach($skuIds as $key=>$skuId){
        $skuVariantValuesArr[] = [
            'variant_value_id' =>$variantValueIds[$key],
            'sku_id' =>$skuId
        ];
    }
    SKUVariantValues::insert($skuVariantValuesArr);
}

注意:仔细阅读代码内的 comments 并相应地工作.

Laravel相关问答推荐

哈希:check()不返回预期结果Laravel 10

为什么Laravel在API请求时返回BadMethodCallException?

发送邮箱后,Laravel重定向偶尔会导致错误500

拉威尔望远镜没有显示请求细节

如何在 Laravel 中使用多对一变形关系

按回车键时如何防止此功能运行?

Laravel 从 5.1 升级到 5.2.0 错误

Laravel 附加额外字段

在 laravel 查询构建器中使用多个 where 子句

laravel:如何在 Eloquent Query 中使用 LOWERCASE 函数?

Laravel 4,如何测试复选框是否被选中?

Laravel 验证 - 输入必须是数组中的项目之一

Laravel Blade 没有额外的空格?

如何在 Laravel 中为模型命名,以免与现有类发生冲突?

未定义的类常量App\Providers\RouteServiceProvider::HOME

带有时间戳的 Laravel 5.1 eloquent::attach() 方法

如何在 Laravel Eloquent 中 Select 某些字段?

在 Laravel 中按用户名查找用户

没有Access-Control-Allow-Origin标头 - Laravel

如果参数不是整数,如何以不同方式定义路由