Besoin d'aide ?

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

  • Avatar de Soufiane1
    Membre depuis :
    09/03/2019
    Messages :
    19

    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!

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    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.

  • Avatar de Soufiane1
    Membre depuis :
    09/03/2019
    Messages :
    19

    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)'
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Essaie comme ça :

    use Illuminate\Validation\Rule;
    ...
    'matriculation' => [
    'required' ,
    'string',
    'between:6,15',
    Rule::unique('motorbikes')->ignore($motorbikes->id),
    ],
  • Avatar de KYoann
    Membre depuis :
    11/02/2019
    Messages :
    37

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

    'matriculation' => 'required|string|max:15|min:6|unique:motorbikes,'.$this->id,

Vous ne pouvez pas répondre à ce sujet.