Besoin d'aide ?

Function rules(), store() & update() in Laravel

Avatar de Soufiane1
Soufiane1

Bonjour,

Je suis en train d'essayer de changer la valeur de mes champs matriculation et number_motorbike mais on dirait que les valeurs existent déjà. Je pense que j'ai un problème de validation dans l'update.

Dans ma function rules() j'ai ceci:

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

Dans ma function store() j'ai ceci

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

        }   

    }

Mon problème est donc dans ma function udapte(), lorsque je veux par example change uniquement la valeur de mon champ matriculation , je récupère un message d'erreur suivant:

"The number motorbike has already been taken."

Voici ma function update(), mais je pense que le poblème vient de ma function 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();
}

D'avance merci!

Posté il y a 1 an
Avatar de bestmomo
bestmomo

Bonjour,

Oui le souci vient de la validation, dans le cas d'un update forcément la valeur existe déjà dans la base si elle n'est pas modifier. La règle "unique" permet d'ignorer un id. Dans la documentation c'est placé à la fin de la description de la règle.

Posté il y a 1 an
Avatar de Soufiane1
Soufiane1

Bonjour,

Effectivement dans la documentation on parle d'utiliser la règle "unique", mais je pense que je l'applique mal aussi.

Je ne comprends pas trop la synthaxe:

Avant j'avais ceci:

'matriculation' => 'required|string|max:15|min:6|unique:motorbikes,matriculation'

Moi, j'ai essayé ceci:

'matriculation' => 'required|string|max:15|min:6|unique:motorbikes->ignore($matriculation->id)' 
Posté il y a 1 an
Avatar de bestmomo
bestmomo

Essaie comme ça :

use Illuminate\Validation\Rule;
...
'matriculation' => [
    'required' , 
    'string', 
    'between:6,15',
    Rule::unique('motorbikes')->ignore($motorbikes->id),
],
Posté il y a 1 an
Avatar de KYoann
KYoann

Dans mes projets je l'ai fait sous cette forme :

'matriculation' => 'required|string|max:15|min:6|unique:motorbikes,'.$this->id,
Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.