我与客户和产品之间存在ManyToMany关系。关联表customer_products
具有以下模式:
CREATE TABLE `customer_products` (
`customer_id` int(5) UNSIGNED NOT NULL,
`product_id` int(10) UNSIGNED NOT NULL,
`status` tinyint(1) DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `customer_products`
--
ALTER TABLE `customer_products`
ADD UNIQUE KEY `customer_id` (`customer_id`,`product_id`),
ADD KEY `product_id` (`product_id`);
换句话说,架构是customer_id
,product_id
和status
。
当我更新产品的客户时,我不想删除缺少的客户ID,因此我将status
字段设置为现有活动客户的1,将0设置为已删除的客户。
我需要在更新操作中保持简单,因此我需要sync()
方法,不会删除缺少的customer_ids,也会将各自的status
更新为0。
此处的过程应包括两个步骤:
status
的{{1}}字段更新为0 customer_id
创建新记录
醇>
我已使用customer_id
参数和sync()
尝试了false
,但它对枢轴syncWithoutDetaching()
字段没有任何操作。
答案 0 :(得分:1)
您可以使用->attach()
代替。并updateExistingPivot
更新status
编辑,因为updateExistingPivot
实际上并不采用数组
类似的东西(假设关系名称为“customers”):
// Update some customer statuses to 0
$product
->customers()
->updateExistingPivot([ids to set the status to 0], ['status' => 0]);
// Then add new ones
$product
->customers()
->attach([new ids], ['status' => 1]);
修改
我误解了这个过程。我能想出的最好的解决方案是3个步骤:
$customerIds = [1, 2, 3];
// Update all customers' statuses, that are not
// in the passed array to 0
$product
->customers()
->newPivotStatement()
->whereNotIn('customer_id', $customerIds)
->update(['status' => 0]);
// Update the rest to status = 1
$product
->customers()
->newPivotStatement()
->whereIn('customer_id', $customerIds)
->update(['status' => 1]);
// Sync the array
$product
->customers()
->sync($customerIds, false);
答案 1 :(得分:0)
从devk回答中,我有以下解决方案,它将取决于两个foreach循环。
{!! Form::open(['route' => ['route.name', ['id' => $user->id]]]) !!}
在Loop1中,任何提交的客户ID都将被创建或更新为状态1
在Loop2中,已记录在客户ID数组中未找到的关系中的任何客户ID将更新为状态0.
我向Laravel提出了一个关于名为softSync