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

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

@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 به هم متصل هستن


ثبت پرسش جدید
میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 3 سال پیش مطرح شد
0

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


مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 3 سال پیش مطرح شد
0

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


Amirilidan78
تخصص : برنامه نویس وب
@Amirilidan78 3 سال پیش مطرح شد
0

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


وب
تخصص : طراح وب و برنامه نویس
@iran 3 سال پیش مطرح شد
0

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

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

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


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

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