Laravel中的函数rules(),store()和update()

时间:2019-10-15 23:08:07

标签: laravel laravel-5

我正在尝试更改字段matriculationnumber_motorbike的值,但是显然这些值已经存在。我有验证问题。

在我的函数 rules()中,我遇到了:(没问题)

public function rules()
    {
        return [
            'matriculation' => 'required|string|max:15|min:6|unique:motorbikes,matriculation',
            'number_motorbike' => 'required|string|max:6|min:6|unique:motorbikes,number_motorbike'
        ];
    }

在我的函数 store()中,我遇到了这个问题(没问题)

ublic function store(MotoRequest $request)
    {


       $exists = Motorbike::where('matriculation', $request->get('matriculation'))->where('number_motorbike', $request->get('number_motorbike'))->count();

       if (!$exists){
            Motorbike::create($request->all());
            return redirect()->route('motorbikes.index')
                ->with('success', 'new data created successfully');
        }

        else{
            return redirect()->route('motorbikes.index')
                ->with('error', 'duplicate');

        }   

    }

enter image description here

我的问题出在我的函数update()中,例如,当我只想更改字段matriculation的值时,我收到一条错误消息“摩托车号码已被占用”。

enter image description here

这是我的函数update(),但我认为问题出在我的函数rules()上吗?

public function edit($id)
    {
        $motorbikes = Motorbike::find($id);
        return view('admin.motorbikes.edit', compact('motorbikes'));
    }

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(MotoRequest $request, $id)
{

    $motorbikes = Motorbike::find($id);
    $motorbikes->matriculation = $request->get('matriculation');
    $motorbikes->number_motorbike = $request->get('number_motorbike');
    $motorbikes->save();
    return redirect()->route('motorbikes.index')
        ->with('success', 'Update!')->withInput();
}

2 个答案:

答案 0 :(得分:2)

您可以使用强制唯一规则来忽略ID:https://laravel.com/docs/6.x/validation#rule-unique

您需要用于更新和存储方法的自定义规则。最好的实现方法是在方法中验证请求。因此,您应该从MotoRequest类中删除rules()方法。

public function update(MotoRequest $request, $id)
{

    $motorbikes = Motorbike::find($id);

    $request->validate([
        'matriculation' => [
            'required','string','max:15','min:6',
            Rule::unique('motorbikes')->ignore($motorbikes) 

        ],
        'number_motorbike' => [
            'required','string','max:6','min:6',
            Rule::unique('motorbikes')->ignore($motorbikes) 
        ]
    ]);

    $motorbikes->matriculation = $request->get('matriculation');
    $motorbikes->number_motorbike = $request->get('number_motorbike');
    $motorbikes->save();
    return redirect()->route('motorbikes.index')
        ->with('success', 'Update!')->withInput();
}

此外,您无需在 store()中再次检查数据库中是否存在记录,因为该记录已经过验证。

public function store(MotoRequest $request)
{
    $request->validate([
        'matriculation' => 'required|string|max:15|min:6|unique:motorbikes,matriculation',
        'number_motorbike' => 'required|string|max:6|min:6|unique:motorbikes,number_motorbike'
    ]);


    Motorbike::create($request->all());
    return redirect()->route('motorbikes.index')
        ->with('success', 'new data created successfully');

}

答案 1 :(得分:0)

我相信这是您的rules函数,当您尝试更新项目时,它正在通过rules函数并看到它已经存在并正在传递错误消息。

看看laravel验证文档 https://laravel.com/docs/5.8/validation#rule-unique

基本上,您将需要与用于更新摩托车的验证规则不同的验证规则。 更新一将要求您忽略当前值