0
votes

Comment mettre à jour sur laravel demander un champ unique lors de la validation

J'essaie de modifier un formulaire où j'ai un message avec un titre, un corps et un slug, le slug est unique, donc si je le modifie et ne le mets pas à jour, il dit qu'il a déjà été pris

J'essaye ceci sur ma validation PostRequest:

public function store(PostStoreRequest $request)
    {
        $validated = $request->validated();
        auth()->user()->posts()->create($validated);
        return redirect()->route('articulos.index');
    }

la fonction sur le contrôleur Post est:

public function rules()
    {
       return [
            'title' => 'required',
            'body' => 'required',
            'metaTitle' => 'required',
            'metaDescription' => 'required',
            'slug' => ['required', Rule::unique('posts')->ignore($this->post)],
        ];
    }

également sur mon formulaire de mise à jour de la lame que j'ai @method ('PUT')


0 commentaires

4 Réponses :


0
votes

Essayez ceci en espérant que cela fonctionnera

public function rules(Request $request)
    {
        return [
            'title' => 'required',
            'body' => 'required',
            'metaTitle' => 'required',
            'metaDescription' => 'required',
            'slug' => 'required|slug|unique:posts,slug,' . $this->post,
        ];
    }


17 commentaires

Maintenant, il dit "Variable non définie: posts (View: C: \ wamp64 \ www \ item.github \ resources \ views \ manager \ posts \ list‌ .blade.php)"


'slug' => ['required', 'slug', Rule :: unique ('posts') -> ignore ($ this-> post, 'id')],


Ceci-> Post est votre identifiant d'objet post?


non, c'est tout le message, j'ai essayé ce que vous avez dit maintenant, j'ai eu une erreur différente "La méthode Illuminate \ Validation \ Validator :: validateSlug n'existe pas."


semble que $ this-post est vide


déboguer et vérifier ce que vous y arrivez


le message est vide, à partir de Request $ request, j'obtiens un gros objet, je peux accéder au slug ou au titre par exemple mais pas à l'ID ou au message


var_dump ($ request-> get ('key') et essayez


je ne sais pas ce qui se passe, en l'utilisant dans sa propre classe, cela indique que "Class App \ Http \ Requests \ PostStoreRequest n'existe pas"


var_dump cette publication et vérifier que vous y obtenez quelque chose?


oui, essayé var_dump ($ request-> get ('key'); exit (); sur PostStoreRequest.php où j'ai la validation des règles et cela renvoie cette erreur


Man var_dump ($ this-> post); essayez ce que vous obtenez faites le moi savoir


Dit vous, NULL, DUNNO Pourquoi je l'envoie de la forme,

id)}} "Méthode = "POST"> @CSRF @Method ('patch')


var_dump ($ request-> get ('id'); exit (); cet essai


renvoie une erreur La classe App \ Http \ Requests \ PostStoreRequest n'existe pas "


dans une route comme celle-ci Route :: put ("user / {id}", "UserController @ update"); ?


si vous essayez d'en ajouter un nouveau, utilisez 'slug' => 'required | slug | unique: posts', et si vous essayez de mettre à jour alors 'slug' => 'required | slug | unique: posts, slug,'. $ request-> id,



0
votes

C'est la seule solution que j'ai trouvée, utiliser mon propre validateur PostRequest ne fonctionne pas donc pour la mise à jour je valide dans la fonction de mise à jour:

public function update(Request $request, $id) {
        $request->validate([
            'slug' => 'required|unique:posts,slug,' . $id,
            'title' => 'required',
        ]);

         $post = Post::find($id);
         $post->fill($request->all());
         $post->save();
        return redirect()->route('articulos.index');
    }

Ce serait cool de savoir pourquoi cela se produit et comment le résoudre, mais cela fonctionne pour le moment


0 commentaires

0
votes

Veuillez essayer ceci pour la méthode Store et Update :

'slug' => [ 
    'required', 
    'slug', 
    'unique:posts,slug' . (isset($this->post)  ? ',' . $this->post : ' ') 
],


2 commentaires

Je ne peux pas mettre cela sur ma validation PostRequest car $ this-> post est NULL, comment puis-je l'obtenir?


dans la méthode du magasin vous n'avez pas besoin et mettez à jour vous passez un identifiant puis récupérez le passage d'objet dans la méthode de validation, puis «unique: posts, slug». (isset ($ object-> slug)? ','. $ object-slug: '')



1
votes

vous devriez essayer ceci:

public function rules()
 {     
       $slug = $this->request->get("slug");

       return [
            'title' => 'required',
            'body' => 'required',
            'metaTitle' => 'required',
            'metaDescription' => 'required',
            'slug' => ['required', Rule::unique('posts')->ignore($slug,'slug')],
        ];
  }


3 commentaires

fonctionne mais si vous essayez d'ajouter un slug qui n'est pas unique lors de sa création, il génère une erreur SQLSTATE [23000]: Violation de contrainte d'intégrité: 1062 Entrée dupliquée 'dasddas' pour la clé 'posts_slug_unique' mais la méthode de mise à jour fonctionne correctement


Vous êtes correct - cela ne fonctionnera que bien avec la mise à jour. Je pense que les demandes de création et de mise à jour doivent être séparées. En cas de création - se débarrasser de '-> Ignorer ($ limace,' Slug ')' Partie


J'ai fait deux demandes de validation, postStore et postUpdate et tout fonctionne bien, merci!