簡體   English   中英

Laravel 5.3雄辯的更新或創建

[英]Laravel 5.3 Eloquent updateOrCreate

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用於更新或創建新記錄。 而且,我不知道該如何處理。 我應該拆分創建和更新方法的方法,還是有什么好的方法可以處理?

您可能想分開您在做什么。

我在玩耍,並想出了這個好玩 (未經測試):

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')]
);

:-}

    $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]);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM