Laravel 5.3 Eloquent updateOrCreate

问题描述 投票:0回答:2
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-> updated_at的隐藏输入放在刀片中,然后在发送更新请求时检查它。在某些情况下,Laravel的updateOrCreate用于更新或创建新记录。而且,我不知道如何处理。我应该分割方法来创建和更新,还是有任何好的方法来处理它?

php laravel eloquent
2个回答
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')]
);

:-}


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]);
        }
© www.soinside.com 2019 - 2024. All rights reserved.