我正在尝试如果有记录只是更新,如果没有记录只是创建。问题是:
已有记录案例:当数据库中已有记录时,它会创建记录。
public function store(Request $request)
{
$time = $request->input('time');
foreach ($request->input('number') as $key => $value) {
Choice::UpdateOrCreate([
'user_id' => Auth::id(),
'time' => $time,
'topic_id' => $key,
'question_number' => $value,
]);
}
}
答案 0 :(得分:2)
根据crud UpdateOrCreate 中的Rest Update,如果找不到匹配的记录,则会创建一条记录。因此,您的Choice :: UpdateOrCreate格式必须像这样
Choice::updateOrCreate(['user_id' => Auth::id(),
'time' => $time,], [
'topic_id' => $key,
'question_number' => $value,
])
其中['user_id'=>验证:: ID() 'time'=> $ time,]是对记录存在的检查。
答案 1 :(得分:1)
尝试使用以下代码替换循环中的代码:
...
Choice::UpdateOrCreate(
['user_id' => Auth::id(), 'time' => $time],
['topic_id' => $key, 'question_number' => $value]
);
...
这将在特定时间搜索用户记录,如果没有则创建一个,但如果有,则会更新其topic_id和question_number。
答案 2 :(得分:1)
使用这种方式:
$matchThese=array('user_id' => Auth::id())
Choice::updateOrCreate($matchThese,['topic_id'=>$key,'question_number' => $value,'time' => $time]);
答案 3 :(得分:1)
您必须将两个参数传递给UpdateOrCreate
,第一个是搜索记录的attributes
,第二个是我们方法文档中的values
:
创建或更新与属性匹配的记录,并用值填充它。
因此,如果您只使用user_id
搜索记录,就必须这样做:
public function store(Request $request)
{
$time = $request->input('time');
foreach ($request->input('number') as $key => $value) {
Choice::UpdateOrCreate([
'user_id' => Auth::id()
],
[
'time' => $time,
'topic_id' => $key,
'question_number' => $value,
]);
}
}