Insérer un tableau dans la base de données
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 :)
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');
}
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 ^^
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)
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?
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.
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.
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.
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.