راکت

حذف روابط hasMany با زیرمجموعه در لاراول

4 پاسخ

@websaz
سلام
من چندتا مدل دارم که با hasMany به هم مربوط هستن
User hasMany Bank
User hasMany profile
User hasMany profile->invoice
حالا میخوام مثلا اگر در مدل user یک کاربر را پاک کردم تمام موارد زیر مجموعش هم پاک بشه ولی هر کاری میکنم و هرچی هم توی نت سرچ کردم به خطا میخورم (خطا برای زمانی هست که مثلا مدل profile زیر مجموعه invoice هم داره و میخواد پاک کنه)

این روش برای پاک کردن تک مدل ها جواب میده

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

حالا اگه بخوام زیر مجموعه مدل user_bank که invoice هست هم پاک بشه اینجا به مشکل میخورم
میشه راهنمایی کنین
اینم کدی هست که براش نوشتم

    protected static function booted()
    {
        static::deleted(function ($user) {
            $user->user_profile()->delete();
            $user->user_bank()->delete();
            $user->user_bank->invoice->each->delete();
        });
    }

البته این کد را همه جوره توی نت بود تست کردم نشد.
توجه : تمام مدل ها با hasMnay به هم متصل هستن

نوب
نوب
@yk5742g
ثبت پرسش جدید

پاسخ‌ها

4
میلاد خسروی
میلاد خسروی
@milwad

تخصص: برنامه نویس بامزه

سلام خسته نباشید
ببین یکی از راه هایی که یادمه میتونی بیای توی foreign key هایی که در دیتابیس ست کردی برای کاربر onDelete رو روی cascade بزاری و اگه user حذف بشه خود به خود اونا هم حذف میشن

مهدی عقیقی
مهدی عقیقی
@MehdiAghighi

تخصص: برنامه نویس وب

کار نمی‌کنه به خاطر این که شما اول دارید user_bank رو پاک می‌کنید ، بعد دوباره دارید ازش استفاده می‌کنید تا به invoice دسترسی پیدا کنید! جای اون دو خط رو عوض کنید.
در ضمن به جای این حرکت بهتر بود توی مایگریشن اون قسمت که از foreign key استفاده کردید onDelete بزارید .

شاید پاسخ شما همین‌جا باشد

Amirilidan78
Amirilidan78
@Amirilidan78

تخصص: برنامه نویس وب

سلام اگر هم نمیخواین از foreign key ها استفاده کنین میتونین واسه model user یه دونه observer درست کنین و روی event deletedاش تمام کار هایی که لازمه رو انجام بدین
https://laravel.com/docs/9.x/eloquent#observers

وب
وب
@iran

تخصص: طراح وب و برنامه نویس

سلام.
در کدهای ایجاد migration به این ترتیب بزنید:

table->foreignId(نام ستون)

و برای پاک کردن هم از دستور foreign می‌توانید کمک بگیرید و مقدار onDelete را برابر با cascade بگذارید.

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

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