Eloquent同步,不会删除旧条目并将特定值设置为其枢轴字段之一

时间:2018-04-07 20:12:34

标签: php laravel laravel-5 eloquent

我与客户和产品之间存在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_idproduct_idstatus

当我更新产品的客户时,我不想删除缺少的客户ID,因此我将status字段设置为现有活动客户的1,将0设置为已删除的客户。

我需要在更新操作中保持简单,因此我需要sync()方法,不会删除缺少的customer_ids,也会将各自的status更新为0。

此处的过程应包括两个步骤:

  1. 将缺席status的{​​{1}}字段更新为0
  2. 为状态值为1
  3. 添加的任何新customer_id创建新记录

    我已使用customer_id参数和sync()尝试了false,但它对枢轴syncWithoutDetaching()字段没有任何操作。

2 个答案:

答案 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

的新方法的建议