Laravel UpdateOrCreate

时间:2018-06-06 09:18:17

标签: laravel eloquent

我正在尝试如果有记录只是更新,如果没有记录只是创建。问题是:

  

已有记录案例:当数据库中已有记录时,它会创建记录。

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

4 个答案:

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