Le coin des artisans

Insérer un tableau dans la base de données

Avatar de Mimachh
Mimachh

Bonjour,

Je débute sur Laravel et je tente de créer un formulaire dans lequel on choisit un ou plusieurs animaux, on le/les décrits et on indique le prix. L'intégration du prix, aucun problème. La description, pareil.

Mon problème se pose sur les checkbox, les informations sont transmises sous forme array, ce que la base de données refuse de traiter. J'ai tenté plein de choses (notamment d'implode), sans succès.

Je vous met les bouts de code associés.

Une partie des checkbox dans le blade.php:


                    <x-jet-input value="cat" id="cat" name="animals[]" type="checkbox"/>
                    <x-jet-input value="rabbit" id="rabbit" name="animals[]" type="checkbox"/>
                 

Le controller pour stocker dans la table annonces :

public function store(AdStore $request)
    {
         $validated = $request->validated();
        $annonces = new annonces(); 
        $annonces->animals= $validated['animals'];
        $annonces->description = $validated['description'];
        $annonces->price = $validated['price'];
        $annonces->save();
        return redirect()->route('create.ad');
        }

La fonction store :

class AdStore extends FormRequest
{
   * @return array
     */
    public function rules()
    {
        return [
        
            'garde_type' => 'required',
            'animals' => 'required',
            'description' => 'required',
            'price' => ['numeric', 'required'],

        ];
    }
}

Si vous avez des solutions je suis preneur.

Merci d'avance :)

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Il doit y avoir un enregistrement pas animal, dans ce sens j'aurai fait un truc du genre:

public function store(AdStore $request)
{
    $validated = $request->validated();
    foreach($validated['animals'] as $animal){
        $annonces = new annonces(); 
        $annonces->animals= $animal;
        $annonces->description = $validated['description'];
        $annonces->price = $validated['price'];
        $annonces->save();
    }
   
    return redirect()->route('create.ad');
}
Avatar de Mimachh
Mimachh

Salut, merci de ta réponse.

En l'occurence ce sont des annonces de garde d'animaux. Je souhaite que l'utilisateur choisisse les animaux qu'il peut garder et qu'il indique son prix. L'annonce ce n'est pas l'animal en soit, c'est le choix des animaux au global, du coup pas certain que ça fonctionne ^^

Avatar de CinquièmeDimension
CinquièmeDimension

Ah OK. Dans ce cas c'est totalement différent. C'est au niveau schéma que ça se joue.

Tu dois avoir une table annonces, une table animaux et une relation ManyToMany entre les deux.

Cf: le blog de notre ami bestmomo ==> https://laravel.sillo.org/many-to-many-to-many/ (ou https://laravel.sillo.org/cours-laravel-9-les-donnees-la-relation-nn/ pour bien coller à laravel 9)

Avatar de Mimachh
Mimachh

J'ai une table annonces, une table user et la relation c'est one to many. Un utilisateur peut poster plusieurs annonces de garde d'animaux. Je n'ai pas de table animaux en revanche puisque le choix du type d'animal à garder se fait dans l'annonce, par le biais des checkbox justement. Si je check "chat", je veux que dans ma table user la colonne "type d'animaux a garder (c'est pas son vrai nom mais pour simplifier)", ajoute la valeur "chat". Si je check "chat", "chien" je veux retrouver dans la colonne "chat, chien".

C'est une mauvaise façon de raisonner selon toi?

Avatar de CinquièmeDimension
CinquièmeDimension

Ben comme ça chaque annonce est associée à un seul animal. Pour en avoir plusieurs, c'est comme je t'ai noté.

Et puis, ca te permet de controller les aminaux un peu plus. Pour ne pas avoir d'annonce pour des gardes de castor.

Avatar de Mimachh
Mimachh

Pourquoi j'aurai des annonces pour des gardes de castor puisque je liste les animaux en utilisant les checkbox? ^^ Ce que j'essaie de comprendre principalement c'est comment je fais entrer dans une colonne de ma base de données, un array. Je dois le transformer en string je pense, mais les test que j'ai fait ne fonctionnent pas.

Avatar de CinquièmeDimension
CinquièmeDimension

Ca a beau être des checkbox, un troll arrivera avec un peu de HTML à te faire passer des trucs.

Moi je te cite les bonnes pratiques, si tu préfère faire différement, libre à toi. A la rigueur, passe un json.

Avatar de Mimachh
Mimachh

Je vais tester en json.

Pour les pratiques que tu m'as proposé, le fait d'avoir des tables pour les animaux pourquoi pas, il n'empêche que derrière je dois rentrer les animaux choisit dans ma table annonces, et donc j'en reviens au même problème de stocker des valeurs sous forme array non?

Vous ne pouvez pas répondre à ce sujet.