通过枢轴表ID而不是模型ID同步
我想在我的方案顺序中通过枢轴ID更新订购产品,而不是同一ID的产品,我想更新我称之为枢轴ID的产品并删除了我未更新的其他产品,但是您从同步语法中知道它接受产品的ID。
示例
这就是我的身体和枢轴表的外观,将产品连接到订单
{
"products": [
{
"product_id": 1,
"color": "red",
"quantity": 2
},
{
"product_id": 1,
"color": "black",
"quantity": 10
},
{
"product_id": 2,
"color": "black",
"quantity": 1
}
]
}
id | ofder_id product_id | product_id | 颜色 | 数量 |
---|---|---|---|---|
1 | 1 1 | 1 1 | 1 | 1 |
1 | 1 | 1 1 1 | 黑色 | 10 |
3 | 1 | 2 | 黑色 | 1 |
在更新订单产品时
{
"products": [
{
"id" : 1,
"product_id" :1 ,
"color": "blue",
"quantity": 12
},
{
"id" : 3,
"product_id" :2,
"color": "blue",
"quantity": 5
}
]}
,我想要我的桌子看起来像
id | ofder_id | product_id products_id products_id products_id | 颜色 | 数量 |
---|---|---|---|---|
1 | 1 | 1 | 蓝色 | 12 |
3 | 1 | 2 | 蓝色 | 5 |
,但得到了预期的错误
"message": "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' (SQL: insert into `order_product` (`color`, `created_at`, `id`, `order_id`, `product_id`, `quantity`, `size`, `updated_at`) values (blue, 2022-07-04 21:38:25, 7, 3, 1, 12, S, 2022-07-04 21:38:25))"
OrderController
public function update(AdminUpdateOrderRequest $request, $id)
{
$orderValidated = $request->validated();
$order = Order::findOrFail($id);
$order->update($orderValidated);
if (isset($orderValidated['products'])) {
$order->products()->sync($orderValidated['products']);
}
DB::table
return OrderResource::make($order)->additional([
'success' => true,
]);
}
order_product迁移
Schema::create('order_product', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id')->nullable()->constrained('orders')->onUpdate('cascade');
$table->foreignId('product_id')->nullable()->constrained('products')->onUpdate('cascade');
$table->integer('quantity')->nullable();
$table->string('color')->nullable();
$table->timestamps();
});
有任何解决我的问题的想法吗?
I want to update order products by pivot id with sync method cause in my scenario order can have more than a product of the same id and I want to update products I called their pivot id and delete others that I didn't update, but u know from sync syntax that it accepts ids of products.
Example
That's how my body and pivot table look like when attaching products to order
{
"products": [
{
"product_id": 1,
"color": "red",
"quantity": 2
},
{
"product_id": 1,
"color": "black",
"quantity": 10
},
{
"product_id": 2,
"color": "black",
"quantity": 1
}
]
}
id | order_id | product_id | color | quantity |
---|---|---|---|---|
1 | 1 | 1 | red | 2 |
2 | 1 | 1 | black | 10 |
3 | 1 | 2 | black | 1 |
When updating the order products
{
"products": [
{
"id" : 1,
"product_id" :1 ,
"color": "blue",
"quantity": 12
},
{
"id" : 3,
"product_id" :2,
"color": "blue",
"quantity": 5
}
]}
how I want my table look like
id | order_id | product_id | color | quantity |
---|---|---|---|---|
1 | 1 | 1 | blue | 12 |
3 | 1 | 2 | blue | 5 |
but got this expected error
"message": "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' (SQL: insert into `order_product` (`color`, `created_at`, `id`, `order_id`, `product_id`, `quantity`, `size`, `updated_at`) values (blue, 2022-07-04 21:38:25, 7, 3, 1, 12, S, 2022-07-04 21:38:25))"
OrderController
public function update(AdminUpdateOrderRequest $request, $id)
{
$orderValidated = $request->validated();
$order = Order::findOrFail($id);
$order->update($orderValidated);
if (isset($orderValidated['products'])) {
$order->products()->sync($orderValidated['products']);
}
DB::table
return OrderResource::make($order)->additional([
'success' => true,
]);
}
order_product migration
Schema::create('order_product', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id')->nullable()->constrained('orders')->onUpdate('cascade');
$table->foreignId('product_id')->nullable()->constrained('products')->onUpdate('cascade');
$table->integer('quantity')->nullable();
$table->string('color')->nullable();
$table->timestamps();
});
Any ideas to solve my issue?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要处理此操作,而无需属于许多关系,并且必须创建一个中间或枢轴模型。
更改订单和产品模型(如果您不使用的产品模型可选)
并且需要在控制器更新方法中
//假设您的请求结构是
您需要创建自己的同步方法,
那么我希望这对您有帮助,并且可能需要您使用交易预防错误,并添加相应的验证
You need to handle this without belongs to many relation, and you must have to create an intermediate or pivot model.
And need to change the order and product model (product model optional if you dont use)
In your controller update method
// Assuming that your request structure is
You need to create your own sync method
I hope this helps you, and probably you need to use a transaction for preventing errors, and, add the respective validations