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