Laravel 5

store() - Enregistrer une clé étrangère dans une table

  • Avatar de anonymus
    Membre depuis :
    24/08/2019
    Messages :
    8

    Bonjour,

    J'ai créé un formulaire qui contient donc des questions (table questions) avec des réponses associées à ces questions (table reponses). Une fois que la personne envoie le formulaire, toutes les données rentrées sont enregistrées dans la table enregistrements_resultats (id, sondages_id, questions_id, reponse, identifiantResultat). "reponse" correspond à toutes ses réponses du formulaire (donc il y a plusieurs lignes, 20 lignes pour 20 questions). L'identifiantResultat correspond à un nombre random attribué à la personne qui a rempli le formulaire (pour pouvoir afficher ses réponses plus tard)

    J'ai un premier problème. Une fois que je souhaite enregistrer dans la table de donnée j'ai une erreur en rapport avec la clé étrangère sondages_id :
    SQLSTATE[HY000]: General error: 1364 Field 'sondages_id' doesn't have a default value (SQL: insert into enregistrements_resultats (reponse) values (Partager du contenu))

    Voici le code :

    public function store(Request $request)
    {

    $enregistrement_resultat = enregistrementResultat::create($request->all());
    $enregistrement_resultat->sondage()->associate(Sondage::find($request->sondages_id));
    $enregistrement_resultat->question()->associate(Question::find($request->questions_id));
    $enregistrement_resultat->identifiantResultat = Uuid::generate()->string;
    $enregistrementResultat->reponse = $request->reponse;

    $enregistrement_resultat->save();

    return redirect()->route('front.index')->with('message', 'TEST');
    }
    namespace App;

    use Illuminate\Database\Eloquent\Model;

    class Sondage extends Model
    {

    public $timestamps = false;

    public function question() {
    return $this->belongsTo(Question::class);
    }

    public function enregistrementsResultats(){
    return $this->hasMany(enregistrementResultat::class);
    }
    namespace App;

    use Illuminate\Database\Eloquent\Model;

    class enregistrementResultat extends Model
    {
    public $timestamps = false;

    public $table = "enregistrements_resultats";

    //bdd
    protected $fillable = ['sondages_id', 'questions_id', 'identifiantResultat', 'reponse'];

    public function question(){
    return $this->belongsTo(Question::class);
    }

    public function sondage(){
    return $this->belongsTo(Sondage::class);
    }

    J'ai une deuxième interrogation : est-ce que ma table enregistrements_resultats est bien faite ? Je ne suis pas sûr de ce que j'ai fais.

    Merci pour votre aide.

  • Avatar de pierrocknroll
    Membre depuis :
    12/08/2019
    Messages :
    7

    Il semble que ton Insert foire parce qu'il n'y a pas toutes les colonnes !
    Sinon, c'est assez bizarre ce random "identifiantResultat", tu n'as pas de table user ?

    De +, tu n'utilises pas super bien le mecanisme automatique d'eloquent. Pas la peine de mettre des public $table =...
    nomme tes collones sans s (sondage_id, question_id)
    t'auras moins de problèmes.

  • Avatar de Dom
    Membre depuis :
    17/07/2017
    Messages :
    20

    Essai quelques choses comme cela :

    Sondage::findOrFail($request->sondages_id)->enregistrementsResultats()->create($request->all());

    https://laravel.com/docs/5.8/eloquent-relationships#the-create-method

  • Avatar de anonymus
    Membre depuis :
    24/08/2019
    Messages :
    8

    Enfaite je me suis renseigné et logiquement je veux enregistrer plusieurs lignes dans la table... Peut-être avec un createMany ?... Le souci c'est qu'il y a 20 réponses à enregistrer dans la table.

    Non je n'ai pas de table user. Qu'est ce que tu me suggères ?
    J'ai mis un public =..... parce que le nom des tables ne correpond pas à la syntaxe du mécanisme d'eloquent...

    Dom, j'ai essayé de faire cela mais a m'affiche toujours la même erreur

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2524

    Salut,

    Le schéma est pas clair, j'ai essayé de le dessiner et je n'y arrive pas...

Vous ne pouvez pas répondre à ce sujet.