Autour de Laravel

onDelete cascade ne fonctionne pas

Avatar de StephaneMarry
StephaneMarry

Bonjour tout le monde. Je viens de commencer mon premier projet Laravel qui avance bien. Un petit task manager.

Pour faire simple, je créer un projet, dans ce projet je peux y ajouter plusieurs taches.

J'ai une table projets et une table tasks. Dans ma table tasks, j'ai ajouté une clé étrangère pour associé ma tache à un projet.

J'aimerais en supprimant un dossier, supprimer toutes les taches associé. J'ai donc fait un onDelete('cascade') lors de ma migrations ( voir ci-dessous ). Ai je fais une erreur, oublié quelques choses ? Je suis un peu perdu, merci pour votre aide ^^

Schema::table('tasks', function (Blueprint $table) {
            //
            $table->unsignedBigInteger('projet_id');
            $table->foreign('projet_id')->references('id')->on('projets')->onDelete('cascade');

            Schema::enableForeignKeyConstraints();
        });

et dans mon controller pour les projets:

 public function destroy($id)
    {
        //

        $projet = Projet::find($id)->delete();
    
        return redirect(url()->previous());

    }
Posté il y a 1 mois
Avatar de MM
MM

Bonjour,

essaye en remplacant $table->unsignedBigInteger('projet_id'); par $table->integer('projet_id')->unsigned();

et remplace

public function destroy($id)

{
    //
    
    $projet = Projet::find($id)->delete();

    return redirect(url()->previous());

}

par :

/**
 * Remove the specified resource from storage.
 *
 * @param  \App\Models\Projet  $projet
 * @return \Illuminate\Http\Response
 */
public function destroy(Projet $projet)
{
    Projet::destroy($projet->id);

     return redirect(url()->previous());
}

chez moi ca fonctionne

Posté il y a 1 mois
Avatar de StephaneMarry
StephaneMarry

Merci pour ton aide et malheuresement, quand je supprime mon projets, les taches restes dans la base de données. :s Je suis sur wamp, donc peut être que ça joue quelque part ?

Posté il y a 1 mois
Avatar de MM
MM

Non je ne pense pas que ca vienne de wamp

Posté il y a 1 mois
Avatar de MM
MM

et si tu remplace

Schema::create('tasks', function (Blueprint $table) {

par

Schema::create('salaries', function (Blueprint $table)

je te met l'exemple de ma table salarie pour que tu puisse comparer

 class CreateSalariesTable extends Migration  
    {
    /**
     * Run the migrations.
     *
     * @return void
     */     
    public function up()    
    {    
            Schema::create('salaries', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('username');
            $table->integer('entreprise_id')->unsigned();  
            $table->timestamps();            
            $table->foreign('entreprise_id')
                    ->references('id')->on('entreprises')
                    ->onDelete('cascade');    
        });                
}


/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('salaries');
}

}

Posté il y a 1 mois
Avatar de StephaneMarry
StephaneMarry

Je me permet de te faire une capture ecran de ma table. On y voit bien la liaison en bas. Je ne vois plus trop quoi faire :s

Posté il y a 1 mois
Avatar de MM
MM

apres moi j'utilise DB Browser mais je pense pas que ca change grand chose

voici le lien si tu souaite changer https://sqlitebrowser.org/

Posté il y a 1 mois
Avatar de MM
MM

est-ce que tu as réussi à faire quelque chose avec l'exemple de la table que je t'es mise plus haut ?

Posté il y a 1 mois
Avatar de StephaneMarry
StephaneMarry

Je viens de faire un test avec ta table que j'ai relié a ma table projets. Le même problème, je supprime le projet en faisant appel à sa fonction destroy et le salarié est toujours dans la table.

public function destroy(Projet $projet)
{
    Projet::destroy($projet->id);

     return redirect(url()->previous());
}

Posté il y a 1 mois
Avatar de MM
MM

bah la j'avoue que c'est curieux..

Posté il y a 1 mois
Avatar de MM
MM

tu peux me montrer te relation stp

Posté il y a 1 mois
Avatar de StephaneMarry
StephaneMarry

Voilà mon model projet:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Projet extends Model
{
    use HasFactory;
    protected $fillable = ['time','name','entreprise_id'];

    public function tasks(){
        return $this->hasMany('App\Models\task');
    }

    public function entreprises(){
        return $this->belongsTo('App\Models\entreprise', 'entreprise_id');
    }

}

model task:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class task extends Model
{
    use HasFactory;
    protected $fillable = ['task','time','note','projet_id','type_tasks_id','user_id'];

    public function users(){
        return $this->belongsToMany('App\models\user');
    }
  
    public function type(){
        return $this->belongsTo('App\models\Type_task', 'type_tasks_id');
    }

}

Posté il y a 1 mois
Avatar de MM
MM

alors je n'ai pas du tout les mêmes "données " que toi

Dans mon projet les salarié sont relier a une entreprise

voici mon model Entreprise :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

    class Entreprise extends Model
    {
            protected $fillable = ['logo', 'nomEntreprise', 'adresse', 'codePostal', 'ville',  'dateCreation', 'numeroSiret',];

            protected $table = 'entreprises'; // Nom de la table concernée par cette classe

            // public $timestamps = false; // Désactive la gestion des colonnes created_at et updated_at


            /**
             * Get the salaries for the blog post.
             */
            public function salaries()
            {
                return $this->hasMany('App\Models\Salarie');
            }
        }

et voici mon model Salarie :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

    class Salarie extends Authenticatable
    {
        use HasFactory, Notifiable;

        protected $guard = 'salarie';

        protected $fillable = [
            'name', 'username', 'email', 'password', 'address', 'zipCode', 'city', 'birthday', 'role',
        ];

        protected $hidden = [
            'password', 'remember_token',
        ];
    }

Je sais pas si ca va t'aider..

Posté il y a 1 mois
Avatar de StephaneMarry
StephaneMarry

Bon après plusieurs recherches et tests, j'ai enfin trouvé !!

Ca venais de la base de données elle même. Engine storage de ma bdd était en MyISAM. MyISAM ne gère pas la fonctionnalité cascade. Il faut être en InnoDB. Après je pensais avoir fait ce qu'il fallait en changant mon fichier my.ini ou même changer l'informaiton dans mon fichier .env cela ne changait rien. J'ai du changer ma variable dans la configuration phpmyadmin.

Voilà, encore merci pour ton temps ^^

Posté il y a 1 mois
Avatar de MM
MM

super si tu as trouvé

de rien , bonne suite dans ton projet

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.