Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Laravel PHP Discussion :

Insertion simultanée dans deux tables


Sujet :

Laravel PHP

  1. #1
    Membre à l'essai
    Insertion simultanée dans deux tables
    Bonsoir! J'ai un formulaire sur lequel j'ai des données qui doivent être insérer dans deux tables différentes à savoir la table calendrier et la table demande. Mais le soucis est que quand je soumet le formulaire je n'ai aucun retour même un dd ne marche pas.
    Voici le code de mon formulaire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <form action="{{route('demande.store')}}" method="POST">
                @csrf
                <fieldset>
                <h2><legend>Confirmation de la demande de crédit</legend></h2>
                <br>
                <div class="form-group">
                  <label for="idTypeCredit">Vous avez choisi : </label>
                  <select name="idTypeCredit" class="form-control" id="idTypeCredit" readonly="true">
                    <option value="{{ $credit->id }}">{{ $credit->libelle }}</option>
                  </select>
                </div>  
     
                <div class="form-group">
                  <label for="montant">Montant</label>
                  <input name="montant" type="text" class="form-control" id="montant" readonly="true" value="{{ $montant }}">
                </div>  
                <div class="form-group">
                  <input type="hidden" class="form-control" name="id_client" value="{{ $id_client }}">
                  <input type="hidden" class="form-control" name="dateCredit" value="{{ $today }}">
                </div>
     
                <div class="form-group">
                  <label for="objetFinancement">Objet de financement</label>
                  <select id="objetFinancement" name="objetFinancement" class="form-control" readonly="true">
                    <option value="{{ $objetFinancement }}">{{ $objetFinancement }}</option>
                  </select>
                </div>
     
                <div class="form-group">
                  <label for="argumentation"> Votre Argumentation</label>
                  <textarea class="form-control" id="argumentation" name="argumentation" rows="3" readonly="true">{{ $argumentaire }}</textarea>
                </div>
                <div class="form-group">
                  <button type="submit" class="btn btn-success">Confirmer</button>
                  <button type="reset" class="btn btn-warnind">Annuler</button>
                </div>
              </fieldset>
            </form>

    le code de mon controller :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public function store(Request $request)
    	{
    		$this->validate($request,[
    			'id_client' => 'required',
    			'dateCredit' => 'required',
    			'idTypeCredit' => 'required',
    			'montantCredit' => 'required',
    			'objetFinancement' => 'required',
    			'argumentation' => 'required'
     
    		]);
     
    		$calendrier = new App\Calendrier;
    		$calendrier->dateCredit = $request->dateCredit;
    		$calendrier->save();
    		//dd($calendrier);
     
    		$demande = new App\Demande;
    		$demande->id_client = $request->id_client;
    		$demande->id_typeCredits = $request->idTypeCredit;
    		$demande->id_date =  $calendrier->id;
    		$demande->montantCredit = $request->montant;
    		$demande->objetFinancement = $request->objetFinancement;
    		$demande->argumentation = $request->argumentation;
    		//dd($demande);
    		$demande->save();
     
    		//dd($demande);
     
    		return "C'est bien enregistrer";
    	}

    et voici le code de ma route:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Route::post('confirm','DemandeController@store')->name('demande.store');
    .

    Une aide ne serait pas du tout de refus. Merci d'avance

  2. #2
    Modérateur

    Bonjour, d'où viennent toutes vos variables de votre formulaire ?

  3. #3
    Membre à l'essai
    Bonjour, mes variables proviennent de mon controleur.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public function confirm(Request $request)
    	{
    		$id_client=Auth::user()->id_client;
     
            $clients = Clients::Where('id', $id_client)->first();
     
            $compte = Compte::Where('id_client', $id_client)->first();
     
            $agence = Agence::Where('id', $clients->id_agence)->first();
     
    		$credit = TypeCredit::Where('id', $request->idTypeCredit)->first();
     
    		$Interet = ($request->montant * $credit->tauxInteret)/100;
     
    		$caution = ($request->montant * $credit->tauxCaution)/100;
     
    		$commission = ($request->montant * $credit->tauxComission)/100;
     
    		$today = date("d/m/Y");
     
    		$duree=$credit->dureeMaxRembours;
     
    		$montant = $request->montant;
     
    		$argumentaire = $request->argumentation;
     
    		$objetFinancement = $request->objetFinancement;
     
    		//dd($montant);
    		if ($montant< $credit->montantMin) {
     
    			return redirect()
    					->back()
    					->withInput()
    					->with('error','Montant trop inférieur');
    		}
    		elseif ($montant > $credit->montantMax) {
     
    			return redirect()
    					->back()
    					->withInput()
    					->with('error','Montant trop supérieur');
     
    		}
     
    		else{
     
    			return view('confirm', compact('clients','compte','agence', 'credit', 'Interet', 'caution', 'commission', 'montant', 'argumentaire','objetFinancement','today','duree', 'id_client'));
    		}
     
    	}

  4. #4
    Modérateur

    Bon alors commençons par le début, vérifions que vous rentrez dans la bonne méthode:


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    public function store(Request $request)
    {
     
    dd('je suis ici');
     
    .......
     
     
    }

  5. #5
    Membre à l'essai
    le dd('je suis ici') marche parfaitement.

  6. #6
    Modérateur

    Ok, on va un peu modifier votre validation et voir si ça passe.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    public function store(Request $request)
    	{
    		$request->validate([
    			'id_client' => 'required',
    			'dateCredit' => 'required',
    			'idTypeCredit' => 'required',
    			'montantCredit' => 'required',
    			'objetFinancement' => 'required',
    			'argumentation' => 'required'
     
    		]);
    dd('je suis ici')
    }

  7. #7
    Membre à l'essai
    après modification le dd('je suis ici') ne marche pas. Quand je valide le formulaire rien ne s'affiche.

  8. #8
    Modérateur

    Ok, cela veux donc dire que cela ne passe pas la validation.
    On va faire un dd sur request pour voir ce qui ne passe pas.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    public function store(Request $request)
    	{
    dd($request)
    		$request->validate([
    			'id_client' => 'required',
    			'dateCredit' => 'required',
    			'idTypeCredit' => 'required',
    			'montantCredit' => 'required',
    			'objetFinancement' => 'required',
    			'argumentation' => 'required'
     
    		]);
    dd('je suis ici')
    }

  9. #9
    Membre à l'essai
    Je viens de répérer l'erreur et le dd('je suis ici') passe.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function store(Request $request)
    	{
     
    		$request->validate([
    			'id_client' => 'required',
    			'dateCredit' => 'required',
    			'idTypeCredit' => 'required',
    			'montant' => 'required',
    			'objetFinancement' => 'required',
    			'argumentation' => 'required'
     
    		]);
              }


    j'avais mis montantCredit au lieu de montant.

    Maintenant que le dd() marche, j'ai un autre problème après ma validation

  10. #10
    Membre à l'essai
    Voici mes migrations.
    Migrations de la table calendrier
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class CreateCalendrierTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('calendrier', function (Blueprint $table) {
     
                $table->date('dateCredit');
                $table->primary('dateCredit');
                $table->timestamps();
            });
        }

    Migration de la table demande
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public function up()
        {
            Schema::create('demandes', function (Blueprint $table) {
                $table->bigIncrements('id');
     
                $table->unsignedBigInteger('id_client');
                $table->foreign('id_client')
                ->references('id')
                ->on('clients')
                ->onDelete('cascade')
                ->onUpdate('cascade');
     
                $table->unsignedBigInteger('id_typeCredits');
                $table->foreign('id_typeCredits')
                ->references('id')
                ->on('type_credits')
                ->onDelete('cascade')
                ->onUpdate('cascade');
     
                $table->date('dateCredit');
                $table->foreign('dateCredit')
                    ->references('dateCredit')
                    ->on('calendrier')
                    ->onDelete('cascade')
                    ->onUpdate('cascade');
     
                $table->string('montantCredit');
                $table->string('objetFinancement');
                $table->text('argumentation');
     
                $table->timestamps();
            });

  11. #11
    Modérateur

    C'est un autre souci, cela dit que vous avez un problème d'intégrité dans vos base de données.
    Typiquement le type de crédit n'as pas l'air d'exister et du coup on vous dit que c'est pas possible.

    Faite un dd de

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    dd($request->idTypeCredit)


    et comparer la résultat avec la table Type_Credit pour voir si cela existe.

  12. #12
    Membre à l'essai
    Le dd sur l'id du type credit a marché.
    Voilà ce que ça m'a renvoyé:


    S'il vous plait jeter un oeil sur la migration de la table calendrier
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function up()
        {
            Schema::create('calendrier', function (Blueprint $table) {
     
                $table->date('dateCredit');
                $table->primary('dateCredit');
                $table->timestamps();
            });
        }

    J'ai des doutes là-dessus. Merci

  13. #13
    Modérateur

    Effectivement votre table est incohérente

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    public function up()
        {
            Schema::create('calendrier', function (Blueprint $table) {
                $table->bigIncrements('id'); 
                $table->date('dateCredit');
                $table->timestamps();
            });
        }

  14. #14
    Membre à l'essai
    Merci, mais j'aimerais envoyer le champ dateCredit comme clé étrangère dans la table demande. Comment puis-je faire cela?

  15. #15
    Modérateur

    ben je dirais ... on peux pas, car une date ne peux pas être unique et une clé pimaire doit-etre unique
    Sinon, si la cohérence n'est pas un souci pour vous, alors la foreignkey de la table demande doit-être de type date

    un truc du genre, mais cela me semble farfelu

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    $table->date('id_typeCredits');
                $table->foreign('id_typeCredits')
                ->references('dateCredit')
                ->on('type_credits')
                ->onDelete('cascade')
                ->onUpdate('cascade');

  16. #16
    Membre à l'essai
    je n'ai pas bien compris votre code.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public function up()
        {
            Schema::create('demandes', function (Blueprint $table) {
                $table->bigIncrements('id');
     
                $table->unsignedBigInteger('id_client');
                $table->foreign('id_client')
                ->references('id')
                ->on('clients')
                ->onDelete('cascade')
                ->onUpdate('cascade');
     
                $table->unsignedBigInteger('id_typeCredits');
                $table->foreign('id_typeCredits')
                ->references('id')
                ->on('type_credits')
                ->onDelete('cascade')
                ->onUpdate('cascade');
     
                $table->date('dateCredit');
                $table->foreign('dateCredit')
                    ->references('dateCredit')
                    ->on('calendrier')
                    ->onDelete('cascade')
                    ->onUpdate('cascade');
     
                $table->string('montantCredit');
                $table->string('objetFinancement');
                $table->text('argumentation');
     
                $table->timestamps();
            });
        }


    La table demande est le resultat de trois tables dont client, calendrier et typeCredit. ma migration n'est pas dans la logique?

  17. #17
    Modérateur

    Excusez moi, je me suis trompé.
    Votre code est correcte.

    par contre, mettre un date en imary key, cela signifie que vous ne pouvez faire qu'un seul crédit par jour, puisque une date doit-être unique.
    Je le mettrais plutôt en timestamp pour avoir les secondes ce qui permettras 84600 crédits par jours.

  18. #18
    Membre à l'essai
    D'accord. Merci beaucoup pour votre aide et pour votre patience.