From 005378de413fb029b8409afd218ec87d5e71f462 Mon Sep 17 00:00:00 2001 From: Nicolas Demangeat Date: Tue, 19 Aug 2025 10:27:36 +0200 Subject: [PATCH] fix: :bug: add cascadeOnDelete to project table and change the Project query in index method in ProjectController --- app/Http/Controllers/Bo/ProjectController.php | 4 +- app/Http/Controllers/Bo/SiteController.php | 1 + app/Models/Site.php | 7 +++- ...7_10_103249_add_favourite_site_to_user.php | 12 +++++- ...dd_delete_on_cascade_to_projects_table.php | 40 +++++++++++++++++++ .../views/bo/pages/projects/index.blade.php | 2 +- 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 database/migrations/2025_08_19_094221_add_delete_on_cascade_to_projects_table.php diff --git a/app/Http/Controllers/Bo/ProjectController.php b/app/Http/Controllers/Bo/ProjectController.php index daea75d..4510191 100644 --- a/app/Http/Controllers/Bo/ProjectController.php +++ b/app/Http/Controllers/Bo/ProjectController.php @@ -23,7 +23,9 @@ class ProjectController extends Controller public function index(Request $request): \Illuminate\Contracts\View\View { /** @var \Illuminate\Database\Eloquent\Builder $projectModels */ - $projectModels = Project::query(); + $projectModels = Project::query()->whereHas('site', function ($query) { + $query->whereNull('deleted_at'); + }); /** @var string $search Search field */ $search = $request->search; diff --git a/app/Http/Controllers/Bo/SiteController.php b/app/Http/Controllers/Bo/SiteController.php index ee3aef5..ad1c028 100644 --- a/app/Http/Controllers/Bo/SiteController.php +++ b/app/Http/Controllers/Bo/SiteController.php @@ -169,6 +169,7 @@ class SiteController extends Controller return DB::transaction(function () use ($site) { if ($site->deleteOrFail()) { $site->users()->detach(); + $site->project()->delete(); return redirect() ->route('bo.sites.index') ->with('success', trans( diff --git a/app/Models/Site.php b/app/Models/Site.php index 3bd1e52..2efd123 100644 --- a/app/Models/Site.php +++ b/app/Models/Site.php @@ -57,6 +57,9 @@ class Site extends Model static::updating(function (self $model) { self::manageFields($model); }); + static::deleting(function ($site) { + $site->project()->get()->each->forceDelete(); + }); static::deleted(function ($site) { $site->invoices()->delete(); $site->tickets()->delete(); @@ -139,11 +142,11 @@ class Site extends Model /** * BelongsTo Project relation * - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + * @return \Illuminate\Database\Eloquent\Relations\hasMany */ public function project() { - return $this->belongsTo(Project::class); + return $this->hasMany(Project::class); } /** diff --git a/database/migrations/2025_07_10_103249_add_favourite_site_to_user.php b/database/migrations/2025_07_10_103249_add_favourite_site_to_user.php index f4bc7c1..7eda1af 100644 --- a/database/migrations/2025_07_10_103249_add_favourite_site_to_user.php +++ b/database/migrations/2025_07_10_103249_add_favourite_site_to_user.php @@ -8,21 +8,29 @@ return new class extends Migration { /** * Run the migrations. + * + * @return void */ public function up(): void { Schema::table('users', function (Blueprint $table) { - $table->foreignId('favourite_site_id')->nullable()->after('gitlab_id')->constrained('sites')->onDelete('set null'); + $table->foreignId('favourite_site_id') + ->nullable() + ->after('gitlab_id') + ->constrained('sites') + ->onDelete('set null'); }); } /** * Reverse the migrations. + * + * @return void */ public function down(): void { Schema::table('users', function (Blueprint $table) { - $table->dropForeign(['favourite_site_id']);; + $table->dropForeign(['favourite_site_id']); $table->dropColumn('favourite_site_id'); }); } diff --git a/database/migrations/2025_08_19_094221_add_delete_on_cascade_to_projects_table.php b/database/migrations/2025_08_19_094221_add_delete_on_cascade_to_projects_table.php new file mode 100644 index 0000000..feb2a01 --- /dev/null +++ b/database/migrations/2025_08_19_094221_add_delete_on_cascade_to_projects_table.php @@ -0,0 +1,40 @@ +dropForeign(['site_id']); + $table->foreign('site_id') + ->references('id') + ->on('sites') + ->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('projects', function (Blueprint $table) { + $table->dropForeign(['site_id']); + + $table->foreign('site_id') + ->references('id') + ->on('sites'); + }); + } +}; diff --git a/resources/views/bo/pages/projects/index.blade.php b/resources/views/bo/pages/projects/index.blade.php index 7d8b2b7..d306b77 100644 --- a/resources/views/bo/pages/projects/index.blade.php +++ b/resources/views/bo/pages/projects/index.blade.php @@ -33,7 +33,7 @@ @foreach ($projectModels as $projectModel) {{ $projectModel->name }} - {{ $projectModel->site->name ?? '' }} + {{ $projectModel->site->name }}