Matio
3 سال پیش توسط Matio مطرح شد
8 پاسخ

برنگرداندن پست های کاربری که soft delete شده

سلام دوستان وقت بخیر.
کاربری داریم که چندین پست و کامنت داره. ممکنه ادمین کاربر رو حذف کنه به صورت Sof delete . با این کار نمیخام که پست های این کاربر دیگه نمایش داده بشه در سایت و همچنین کامنت هاش. از طرفی ممکنه دوباره کاربر رو بازیابی کنم و بخوام پست ها و کامنت هاش دوباره نمایش داده بشه در سایت.
روش مناسب برای پیاده سازی این مسئله چیست؟
@abdolrahman @gomnam @mhyeganeh @juza66 @endworld @hesammousavi
با تشکر


ثبت پرسش جدید
مهدی عقیقی
تخصص : برنامه نویس وب
@MehdiAghighi 3 سال پیش آپدیت شد
1

سلام وقتتون بخیر.

یک گلوبال اسکوپ توی مدل Post و Comment تعریف کنید. مثل کد زیر:

class Post extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::addGlobalScope('activeUsers', function (Builder $builder) {
            $builder->whereHas('user', function (Builder $query) { 
                $query->whereNull("deleted_at")
            });
        });
    }
}

مستندات گلوبال اسکوپ‌ها هم اینجا بخونید.

این کوئری یک اسکوپ گلوبال ( که توی همه‌ی کوئری‌هاتون خودش به صورت اتوماتیک این رو هم میزاره ) درست بشه و فقط پست‌های کاربر‌هایی بیاد که فیلد deleted_at شون null هست.

فقط پارامتر اولی که به whereHas میدید باید اسم ریلیشنی که بین Post و User هست باشه.


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 3 سال پیش آپدیت شد
1

درود ...
اگر می خوای برای همیشه دیتاهای softdelete شده بر نگرده می توانید از کد زیر استفاده کنید:

$post->forceDelete();

این کد دیتا را برای همیشه حذف می کنه...


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

ن نمیخام برای همیشه. چون کاربرا ممکنه دوباره بازیابی بشه
@endworld


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 3 سال پیش مطرح شد
1

برای بازیابی دیتا کد زیر:

$post->restore();

Matio
تخصص : برنامه نویس
@matio 3 سال پیش آپدیت شد
1

ممنون از راهنمایی و پیگیری های شما @endworld
فکر کنم من سوالم رو اشتباه و مبهم پرسیدم. نگاه کنید کاربری داریم که چندین پست و کامنت داره. ممکنه ادمین کاربر رو حذف کنه به صورت Sof delete با این کار نمیخام که پست های این کاربر دیگه نمایش داده بشه در سایت و همچنین کامنت هاش. از طرفی ممکنه دوباره کاربر رو بازیابی کنم و بخوام پست ها و کامنت هاش دوباره نمایش داده بشه در سایت.


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 3 سال پیش مطرح شد
1

@matio
به پیوند زیر مراجعه کن به جوابت می رسی یا نه :
https://medium.com/@chrissoemma/laravel-5-8-delete-and-soft-delete-practical-examples-b9b71c0a97f


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

سلام وقتتون بخیر.

یک گلوبال اسکوپ توی مدل Post و Comment تعریف کنید. مثل کد زیر:

class Post extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::addGlobalScope('activeUsers', function (Builder $builder) {
            $builder->whereHas('user', function (Builder $query) { 
                $query->whereNull("deleted_at")
            });
        });
    }
}

مستندات گلوبال اسکوپ‌ها هم اینجا بخونید.

این کوئری یک اسکوپ گلوبال ( که توی همه‌ی کوئری‌هاتون خودش به صورت اتوماتیک این رو هم میزاره ) درست بشه و فقط پست‌های کاربر‌هایی بیاد که فیلد deleted_at شون null هست.

فقط پارامتر اولی که به whereHas میدید باید اسم ریلیشنی که بین Post و User هست باشه.


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

ممنون @MehdiAghighi
فعلا دارم از همین روش استفاده می کنم. خواستم بدونم با تجربه ها هم از همین روش استفاده می کنن.


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

@matio شاید یه راه منطقی تر این باشه که که گلوبال اسکوپ کلاس درست کنید و هر جا خواستید ازش استفاده کنید صرفا همین تیکه رو بزارید

static::addGlobalScope(new ActiveUsers);

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

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