在Laravel 5.4中更新对象数组

时间:2017-04-20 14:07:32

标签: laravel laravel-5 laravel-5.4

我使用Laravel作为Angular应用程序的API。其中一个控制器必须更新一个对象数组。

这个来自Angular的数组可能有

  1. 相同的对象,但具有不同的属性
  2. 其中一个对象可能已被删除
  3. 新对象
  4. 所以,我不能只更新我拥有的对象,因为我需要删除不在数组上的记录,并创建新记录。

    目前,我有一个不太好的解决方案来删除所有以前的记录并根据数组创建新记录。像这样:

    Sample::where('contest_id', $request->get('contest_id'))
            ->where('type', '0')
            ->delete();
    $samples = $request->get('samples');
    foreach ( $samples as $sample ) {
            Sample::create($sample);
    }
    

    但是,我想添加一个活动记录器来跟踪变化,但上述解决方案没有帮助。活动记录器的工作方式如下:

    activity()
         ->causedBy($user)
         ->performedOn($sample)
         ->withProperties($properties)
         ->log('update'); //or new or delete
    

    $properties是这样的:

     $properties = [
         'property' => [
              'old' => $old_sample, // empty on creating new record
              'new' => $sample // empty on deleting old record
          ],
     ];
    

    你能提出什么建议吗?

2 个答案:

答案 0 :(得分:0)

当您需要更新记录时,您的前端还能发送sample_id吗?如果你能够做到这一点,你可以玩收藏夹并做出类似这样的事情:

// Retrieves all samples and turn them into a Collection
$samples         = collect($request->get('samples'));
// Gets only the sample_ids that are not null and greater than zero
$changed_ids     = $samples->pluck('sample_id')->filter()->all();

// These samples are new - create them
$new_samples     = $samples->whereStrict('sample_id', null);
// These samples were changed - update them
$changed_samples = $samples->whereIn('sample_id', $changed_ids);
// These samples were deleted - remove them
$deleted_samples = Sample::whereNotIn('sample_id', $changed_ids);

答案 1 :(得分:0)

您的解决方案似乎效率最高,您是否可以检索要删除的记录,将其记录为已删除,然后实际删除它们,然后记录新的记录的创建?

在这种情况下,您的日志实际上更好地反映了发生的活动。