Projets Laravel France

Clé étrangère non renseignée (null)

Avatar de edouardo
edouardo

Bonjour à tous,

J'ai un soucis concernant les clefs étrangères dans ma BDD qui ne ce renseignent pas. Toutes les autres tables ce remplissent bien via les données formulaire, mais les clefs étrangères non.

Un exemple du problème : j'ai une table formulaire, et une autre pièces jointes. Dans la table pièces jointes, nous retrouvons une relation 1:1 avec formulaire (via clé étrangère 'idformulaire') mais à chaque validation, il me renvoi : 'error: 1364 Field 'idformulaire' doesn't have a default value.'

Dois-je définir moi-même sa valeur ? Je n'ai trouvé aucun exemple de cela dans la doc.

J'ai bien entendu établi les relations entre les models :

Model du formulaire : 
public function piecesjointe()
    {
        return $this->hasOne('App\piecejointe');
    }
----------------------------------------------------------------------------------------------    

Model pièces jointes : 
        public function formulaire()
    {
        return $this->belongsTo('App\FormulaireModel');
    }
Posté il y a 1 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Il semblerait que ce soit au niveau de ta pièce jointe qu'il ne comprends pas à quoi l'attacher. Il nous faudrait voir ton formulaire et ton controller pour bien se faire une idée.

Tu as une relation 1:1 donc:

  • Il ne peut pas exister de pièce jointe sans formulaire attaché
  • Il ne peux pas exister de formulaire sans pièce jointe attachée
  • Il ne peux pas exister de formulaire avec plusieurs pièces jointes attachées

Dans le cas d'une relation 1:1 pourquoi faire 2 tables séparées ?

Posté il y a 1 mois
Avatar de edouardo
edouardo

Voici la partie du controller qui gère l'insertion des URL où ce situe les images :

    /* Création d'un dossier avec le nom renseigné */
        $test=Storage::makeDirectory($request->session()->get('nom'));
        /* Insertion des pièces jointes dans le dossier */
        $path1 = $request->file('reliden')->store($request->session()->get('nom'));
        $path2 = $request->file('copiesecu')->store($request->session()->get('nom'));
        $path3 = $request->file('carte')->store($request->session()->get('nom'));
        $path = $request->file('cv')->store($request->session()->get('nom'));
        
        /* Put en session pour récupérer l'URL*/
        $request->session()->put('reliden',$path1);
        $request->session()->put('copiesecu',$path2);
        $request->session()->put('carte',$path3);
        $request->session()->put('cv',$path);

        /* Insertion des URL en BDD*/
        $piecejointe=new piecejointe([
            'reliden'=>$request->session()->get('reliden'),
            'copiesecu'=>$request->session()->get('copiesecu'),
            'carte'=>$request->session()->get('carte'),
            'cv'=>$request->session()->get('cv'),
        ]);

Et la partie du formulaire qui vient valider cela :

  <form  method="post" enctype="multipart/form-data" action="{{ route('formulaire.store') }}" class="row bg-white flex-column " >
@csrf

     <div id="blocPieceJointe" class="flex-column col-12">

         <div class=" mb-5 justify-content-around ">
             <label for="reliden">UN RELEVE D'IDENTITE BANCAIRE OU POSTAL</label>
             <input type="file" id="reliden" name="reliden" >
         </div>

         <div class=" mb-5 justify-content-around ">
             <label for="copiesecu">UNE COPIE DE L'ATTESTATION DE SECURITE SOCIALE</label>
             <input type="file" id="copiesecu" name="copiesecu">
         </div>

         <div class=" row mb-5  ">
             <label for="carte">UNE COPIE RECTO VERSO VERSO DE LA CARTE D'IDENTITE </label>
             <input type="file" id="carte" name="carte">
         </div>

         <div class=" row mb-5 ">
             <label for="cv">UN CURRICULUM MIS A JOUR</label>
             <input type="file" id="cv" name="cv">
         </div>
     </div>
      <div class="row justify-content-between m-0 p-0">
        <button type="button"  class="btna"><a href="home">PRECEDENT</a></button>
        <input type="checkbox" id="case" name="case">
        <label for="case" class="border border-dark">EN COCHANT CETTE CASE JE DÉCLARE SUR L'HONNEUR L'EXACTITUDE
            DES RENSEIGNEMENTS  QUE J'AI FOURNIS.</label>
        <input type="submit" class="btna" value="VALIDER" >
    </div>
    </form>

Aussi pour répondre à la dernière question, ce projet est dans le cadre d'un stage, je trouve aussi bête de créer des tables ne comportant qu'une relation 1:1, mais lorsque j'ai posé la question (car ils m'ont aussi fait créer une table pour la civilité (Mr/Mme), pour les intervenants (Type D'intervention)), j'ai eu comme réponse :"C'est défini dans le cahier des charges, c'est comme cela". Donc j'applique bêtement en sachant que c'est inutile ..

Posté il y a 1 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Une table pour la civilité, je comprends la logique.

Donc pour en revenir à ton erreur, tu essaie d'enregistrer une pière jointe sans avoir enregistré ton formulaire. Donc, je pense qu'il faut un $formulaire = new Formulaire([...]); avant ton $piecejointe pour pouvoir faire

    $piecejointe = new piecejointe([
        ...
        'idformulaire' => $formulaire->id,
    ]);
Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.