Bonjour à tous.
J'ai suivi le tutoriel sur Laravel avec les Tags et la relation BelongsToMany. Et suite au tutoriel j'ai voulu essayer de gérer la gestion des duplications à cause des majuscules. Mais là, je sèche.

Du coup, j'ai commencé l'histoire avec ce test là :

public function testDuplicateTags () {
        $jeux = factory(Produit::class)->create();
        $jeux->saveTags('salut, Salut');
        $this->assertEquals(1, Tag::count());
    }

Pour ça, dans mon Taggable.php, j'ai fait de cette manière :

public static function array_iunique($array){
        return array_intersect_key(
            $array,
            array_unique(array_map("StrToLower", $array))
        );
    }

public function saveTags(){
  //...
    $tags_create = array_diff($tags, $persisted_tags->pluck('name')->all());

        $tags_to_create = $this->array_iunique($tags_create);

        $tags_to_create = array_map(function($tag){
            return [
                'name' => $tag,
                'slug' => Str::slug($tag),
                'produit_count' => 1
            ];
        }, $tags_to_create);

   // ....     

La fonction array _ iunique récupère mes tags, les met tous en minuscule, et les compare, pour ensuite me renvoyer un tableau sans doublons.

Du coup, ça fonctionne, pas de soucis. Sauf que, j'ai essayé en rajoutant un simple ajout de tag après le premier :

public function testDuplicateTags () {
        $jeux = factory(Produit::class)->create();
        $jeux->saveTags('salut, Salut');
        $this->assertEquals(1, Tag::count());
        $jeux->saveTags('salut, Salut');
        $this->assertEquals(1, Tag::count());
    }

Et là, la fonction me renvois deux tableaux, un avec "salut", et l'autre avec "Salut", du coup, je retourne à la case départ.
J'ai essayé d'utiliser les slugs comme proposé à la fin du tutoriel, mais je n'ai pas réussi à les récupérer et à les comparer.

Du coup, si quelqu'un à une piste qui me débloquerais, et me permettrais d'avancer un peu, je suis preneur ^^

2 réponses


Tu ne vérifies jamais en BDD si le tag existe, commences par là déjà ;)

IL suffit après simplement d'appliquer un str_slug sur le tag que tu crées et de checker s'il n'existe pas déjà en bdd avant de l'insérer. Tout simplement.

Arckays
Auteur

Bonjour, merci pour ta réponse.

Dans mon code j'ai une ligne qui va récupérer les tags qui existent déjà :

$persisted_tags = Tag::whereIn('name', $tags)->get();

et du coup le array diff va ensuite soustraire les tags déjà présent dans $persisted tags.

Du coup, j'ai mis un Str::slug sur le nom de mon tag :

$tags_to_create = array_map(function($tag){
            return [
                'name' => Str::slug($tag),
                'slug' => Str::slug($tag),
                'produit_count' => 1
            ];
        }, $tags_to_create);

Et du coup avec un print _ r de mon $tags-to-create je me retrouve avec ce tableau :

FArray
(
    [0] => Array
        (
            [name] => salut
            [slug] => salut
            [produit_count] => 1
        )

    [1] => Array
        (
            [name] => salut
            [slug] => salut
            [produit_count] => 1
        )

)

A partir de là, je n'arrive pas retirer le deuxième tag, celui en surplus. J'ai essayé avec un deuxième array-diff, mais je me retrouve avec une erreur "array to string conversion"