Bonjour à tous

Voila je resume un peu je bosse sur un api qui gera une partie blog les articles alias post seront taggé comme c'est souvent les cas dans les blog l'api je precise est sous la forme REST.
une route

Route::post('posts/{postId}/tags', 'PostTagController@store');

me sert à attaché mes tags avec un getOrCreate basé sur un slug unique en db et un attach() pour la table pivot bref rien de particulier par ici, mais comme je n'aime pas les tags en doublons (plus sur leurs sens que réelement un doublon d'un point de vue technique) j'ai une route

Route::put('tags/{id}', 'TagController@update');

qui me permet de mettre à jour le tag (normal) mais aussi de combiner les tags si leur slug devient identique.
je m'explique en situation:
Je crée un tag sur mon article 'AngularJS 2.0 les changements notables' qui sera 'javascript'
Un autre tag sur 'Avalanche de nouveautés pour jQuery' qui cette fois sera 'java script'
Je me balade sur la liste complete des tags et je vois ... javascript, java script, ... comme je suis maniaque je corrige mon tag 'java script' en 'javascript' voila s'qu'il se passe coté api:

    public function update(Request $request, $id) {
        if (!(is_numeric($id) && $tag = Tag::withCount('posts')->find($id)))
            return response()->json(['code' => 244], 404);
        $rules = [
            'name' => 'required|max:100',
        ];
        $messages = [
            'name.required' => "name.required",
            'name.max' => "name.max",
        ];
        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails())
            return response()->json(['code' => 241, 'validator' => $validator->messages()], 400);
        if($request->input('name') != $tag->name) {
            if($tagAlreadyExist = Tag::where('slug', Str::slug($request->input('name')))->where('id', '!=', $tag->id)->first()) {// Combine both tags in one
                $tagAlreadyExist->name = $request->input('name');// Update the name of the tag who already exist (difference between name/slug example: MY TAG (my-tag) and my tag (my-tag))
                $tagAlreadyExist->save();
                $postIdToEscape = Tag::find($tagAlreadyExist->id)->posts()->get()->pluck('id')->toArray();// Get post_id where the tag who already exist is set to exclude it from the next update (to escape duplicate entries)
                PostTag::where('tag_id', $tag->id)->whereNotIn('post_id', $postIdToEscape)->update(['tag_id' => $tagAlreadyExist->id]);// Combine the useless tag with the tag who already exist
                $tag->delete();// Delete useless tag and PostTag assignement on cascade
                $tag = $tagAlreadyExist;// Replace the useless tag by the tag who already exist
            } else {// Update tag
                $tag->name = $request->input('name');
                $tag->slug = Str::slug($tag->name);
                $tag->save();
            }
        }
        return response()->json(['tag' => $tag], 200);
    }

En bref je valide le nom du tag, je le slugify, je vérifie s'il n'existe pas en db s'il existe déjà je remplace les entrées dans la table pivot par celle du tag existant (j'échappe les entrées ou le tag existant est déjà présent pour éviter les doublons) et je supprime mon tag devenu inutile (en cascade), dans le cas où le slug n'est pas présent je ne fais que la mise à jour.
Tout est fonctionnel mais est la façon la plus simple?

Aucune réponse