Laravel 5

Modification et suppression dans une table pivot

  • Avatar de SergeKonan
    Membre depuis :
    16/06/2017
    Messages :
    57

    Salut à tous!
    Je viens vers vous pour essayer de trouver un solution à mon soucis.
    En effet, j'ai une relation BelongsToMany entre deux table filière et diplome, donc la table pivot est diplome_filiere .
    L'insertion marche à la perfection avec : $diplome->filieres()->attach($request['filiere_id']);

    Je souhaite procédé maintenant à la mise à jour de cette table et la suppression.
    A la suppression je fais ceci:

    public function getDeboucheDelete($id)
    {
    Diplome::where('id', $id)->delete();

    return redirect()->back();
    }

    on m'affiche l'erreur suivante:

    Illuminate \ Database \ QueryException (23000)
    SQLSTATE [23000]: Violation de contrainte d'intégrité: 1451 Impossible de supprimer ou de mettre à jour une ligne mère: une contrainte de clé étrangère échoue (soukloumaps.debouche_filiere, CONSTRAINTdebouche_filiere_debouche_id_foreign FOREIGN KEY (debouche_id) REFERENCESdebouches (id)) (SQL: supprimer dedebouchesid = 1)

    Merci de m'apporter aide pour evoluer dans mon projet.

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

    Salut,

    Puisque tu as créé une relation entre diplomes et le pivot tu as une contrainte d'intégrité. Quand tu supprimes un enregistrement de la table diplomes et qu'une clé étrangère se trouve dans le pivot que se passe-t-il ? Tout dépend comment tu as défini la contrainte.

    Tu peux très bien décider d'avoir une suppression automatique des enregistrements liés dans le pivot, dans ce cas tu définis un ondelete cascade. Mais apparemment tu n'as pas fait ça dans la définition de ta table. Donc tu dois d'abord détacher tous les enregistrements liés et ensuite supprimer le diplôme.

  • Avatar de SergeKonan
    Membre depuis :
    16/06/2017
    Messages :
    57

    Voici l'existant:

    public function up()
    {
    Schema::create('diplome_filiere', function (Blueprint $table) {
    $table->increments('id');

    $table->integer('filiere_id')->unsigned()->nullable();
    $table->foreign('filiere_id')->references('id')
    ->on('filieres');

    $table->integer('diplome_id')->unsigned()->nullable();
    $table->foreign('diplome_id')->references('id')
    ->on('diplomes');

    $table->timestamps();
    });
    }
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Oui c'est ce que je disais tu as rien prévu donc tu es en mode RESTRICT. Pour changer de mode :

    $table->foreign('diplome_id')->references('id')->on('diplomes')->onDelete('cascade');
  • Avatar de SergeKonan
    Membre depuis :
    16/06/2017
    Messages :
    57

    Lorsque je fais un rollback pour ensuite ajouter la ligne ci-dessus

    $table->foreign('diplome_id')->references('id')->on('diplomes')->onDelete('cascade');

    J'ai cette erreur ci-dessous lorsque je veux ajouter un diplome.

    "SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (soukloumaps.debouche_filiere, CONSTRAINT debouche_filiere_debouche_id_foreign FOREIGN KEY (debouche_id) REFERENCES diplomes (id) ON DELETE CASCADE) (SQL: insert into debouche_filiere (debouche_id, filiere_id) values (2, 1))
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Tu as bien une filière avec l'id 1?

  • Avatar de SergeKonan
    Membre depuis :
    16/06/2017
    Messages :
    57
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2178

    Alors c'est le debouche avec l'id 2 qui existe pas...

Vous ne pouvez pas répondre à ce sujet.