product_id)->get(); //获取当前供应商产品的所有代理商产品ID AgentProduct::query() ->where('product_id', $this->product_id) ->chunk(5, function ($agent_products) use ($product_specs) { //当前供应商产品所有规格的ID $product_spec_ids = $product_specs->pluck('id')->toArray(); //删除供应商已经删除的规格 AgentProductSpec::query() ->whereIn('agent_product_id', $agent_products->pluck('id')->toArray()) ->whereNotIn('product_spec_id', $product_spec_ids) ->delete(); //将代理商规格中销售价小于供应商销售价的,将代理商的销售价设置为供应商的销售价 foreach ($product_specs as $spec) { AgentProductSpec::query() ->where([['product_spec_id', '=', $spec->id], ['price', '<', $spec->price]]) ->update([ 'price' => $spec->price, 'stock' => DB::raw("IF(`stock` > {$spec->stock}, {$spec->stock}, `stock`)"), 'original_price' => DB::raw("IF(`original_price` < {$spec->original_price}, {$spec->original_price}, `original_price`)"), ]); } //供应商新增,但代理商还没有的规格,同步给代理商 foreach ($agent_products as $ap) { //代理商已有的规格(如果代理商删除过的规格不再同步过来,这里加上withTrashed即可) $ap_spec_ids = AgentProductSpec::where('agent_product_id', $ap->id)->pluck('product_spec_id')->toArray(); //代理商没有的规格 $agent_no_spec_ids = array_diff($product_spec_ids, $ap_spec_ids); AgentProductSpec::query() ->insert( array_map(function ($v) use ($ap, $product_specs) { $product_spec = $product_specs->find($v); return [ 'agent_product_id' => $ap->id, 'product_spec_id' => $v, 'name' => '', 'date' => null, 'stock' => $product_spec->stock, 'original_price' => $product_spec->original_price, 'price' => $product_spec->price, ]; }, $agent_no_spec_ids) ); //设置产品的销售价(列表页显示的价格) $psArr = $product_specs->toArray(); $ap->price = min(array_column($psArr, 'price')); $ap->original_price = min(array_column($psArr, 'original_price')); //如果代理商库存大于供应商库存,将代理商库存修改为供应商的库存 $pStock = array_sum(array_column($psArr, 'stock')); if ($ap->stock > $pStock) { $ap->stock = $pStock; } $ap->save(); } }); } }