Laravel 5.3 Eloquent updateOrCreate

时间:2017-12-14 08:01:21

标签: php laravel eloquent

try {
     \DB::beginTransaction();
      Model::updateOrCreate( ['id' => $id, 'number' => $number],
          ['value' => $request->get('value')]
      );
            \DB::commit();
     } catch (\Exception $e) {
            \DB::rollBack();
            throw new \Exception($e->error());
     }

我正在处理一项任务,即创建一个共同特征,以防止多个用户同时更新记录。而且,我的方法是在刀片中放入$ data-&gt; updated_at的隐藏输入,然后在发送更新请求时检查它。在某些情况下,Laravel的updateOrCreate用于更新或创建新记录。而且,我不知道如何处理这个问题。我应该分割创建和更新的方法,还是有任何好的方法来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:0)

你可能想分开你在做什么。

我正在玩这个并为有趣(未经过测试)提出这个问题:

Illuminate\Database\Eloquent\Builder::macro('createOrUpdateWhen', function ($attributes = [], $values = [], $when = null) {
    $m = $this->firstOrNew($attributes);

    if (is_array($when)) {
        $when = function ($m) use ($when) {
            foreach ($when as $key => $value) {
                if ($m->$key != $value) {
                    return false;
                }
            }

            return true;
        }
    }

    if (! $m->exists || $when($m)) {
        $m->fill($values);
    }

    $m->save();

    return $m;
});

$m = M::createOrUpdateWhen($attributes, $values, function ($m) use ($request) {
    return $m->updated_at == $request->input('updated_at');
});

$m = M::createOrUpdateWhen(
    $attributes, $values, ['updated_at' => $request->input('updated_at')]
);

:-}

答案 1 :(得分:0)

    $post = Model::where([['id', $id], ['number', $number]])->first();
    try {
        \DB::beginTransaction();
        if (is_null($post)) {
            Model::create($input);
        } else {
            $post->updateWithExclLock($request->get('updated_at'), $input]);
        }