نوب
3 سال پیش توسط نوب مطرح شد
1 پاسخ

حذف ردیف های یک relationship در لاراول

سلام دوستان

من یه مشکلی دارم که وقتی ردیفی که دارای مدل فرزند هست را حذف میکنم اون ردیف مربوطه در مدل فرزند حذف نمیشه
مثلا جدول users یه رابط user_profile داره ولی وقتی کاربر را از users حذف میکنم ردیفش توی user_profile حذف نمیشه

Schema::create('user_profiles', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id')->unique();
            $table->foreign('user_id')->on('users')->references('id')->onDelete('cascade');
            $table->string('nationalCode', 10)->nullable();
            $table->string('phone', 15)->nullable();
            $table->string('mobile', 15)->nullable();
            $table->timestamps();
        });

توی config/database.php هم قسمت engine را به صورت زیر زدم

'engine' => 'InnoDB',

اینم قسمت حذف

    public function destroy(User $user)
    {
            $user->delete();
            toast('کاربر موردنظر با موفقیت حذف شد', 'success');
            return redirect()->back();
    }

ثبت پرسش جدید
مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش آپدیت شد
0

چند تا راه وجود داره
1- (basic) ميتونيد خودتون تو كنترلر قبل از حذف user پروفايل اون يوزر رو پاك كنيد
2- متد delete رو در داخل مدل user بنويسيد (override كنيد) تا در زماني كه متد delete() رو كال ميكنيد روابطي كه ميخواييد رو هم پاك كنه

    public function delete(){

        // delete all associated 
        $this->user_profile()->delete();

        // delete the parent
        return parent::delete();
    }

3- (راه حل رسمي) استفاده از event هاي eloquent ، در eloquent لاراول وقايعي رو تعريف كرده كه ميتونيد ست كنيد در زمان رخ داد هر كدوم چه اتفاقي بيوفته، يكي از اين وقايع deleting و یکی deleted هست،
تو اين روش باز چند تا راه داريد،
شما ميتونيد در داخل مدل یوزر dispatchesEvents رو به اين صورت تعريف كنيد

    protected $dispatchesEvents = [
        'deleted' => UserDeleted::class,
    ];

حالا هر كاربري كه حذف بشه بصورت اتوماتيك Event مربوطه كه اينجا UserDeleted::class هست (که باید خودتون بسازید) صدا زده ميشه
راه ديگه استفاده از observer ها هست كه چون اینجا فقط در مورد حذف کاربر صحبت میکنیم جاش نیست توضیح بدم.
و در ورژن 8 لاراول استفاده از كلوژر هم اضافه شده كه شما ميتونيد داخل مدل اينو تعريف كنيد و ديگه event listener جداگانه براش نسازيد

    protected static function booted()
    {
        static::deleted(function ($user) {
            $user->user_profile()->delete();
            // ...
        });
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام