اذهب إلى المحتوى

السؤال

نشر

لدي جدول للمستخدمين user وأرغب عند حذف مستخدم ما من الجدول:

$user->delete();

أن يقوم تلقائياً بحذف الصور المرتبطة بهذا المستخدم مثلاً:

$this->photo()->delete();

كيف يمكنني تنفيذ ذلك بشكل تلقائي دون الحاجة لكتابة العملية الثانية بشكل يدوي؟

Recommended Posts

  • 0
نشر

يُمكنك إضافة قيد على مُستوى قاعدة البيانات في جدول photos:

في الإصدارات القديمة:

$table->unsignedInteger('user_id');

$table->foreign('user_id')
	->references('id')
	->on('users')
	->onDelete('cascade');;

في الإصدارات الحديثة تم إختصار العملية بهذا الشكل:

$table->foreignId('user_id')
  ->constrained()
  ->onDelete('cascade');

// أو

$table->foreignId('user_id')
  ->constrained()
  ->cascadeOnDelete();

// او 

$table->foreignId('user_id')
  ->constrained('users') // تضع إسم الجدول إن لم تقم بإحترام القاعدة في تسمية الجداول و المفاتيح
  ->cascadeOnDelete();

 

  • 0
نشر

إن تنفيذ ذلك بشكل أمثلي وفق التوثيق الرسمي للارافيل يتم عن طريق أحداث Eloquent Events، فيمكنك استخدام الحدث deleting وتنفيذ أي كود مرافق لعملية الحذف كالتالي:

class User extends Eloquent
{
    public function photos()
    {
        return $this->has_many('Photo');
    }

    
    public static function boot() {
        parent::boot();

        static::deleting(function($user) { 
             $user->photos()->delete();
             // تنفيذ العمليات هنا
        });
    }
}

بحيث يتم استدعاء التابع قبل عملية الحذف ويتم حذف جميع البيانات المرتبطة بهذا المستخدم. من الأفضل أيضاً استخدام التناقلات transactions ووضع كامل العملية بداخلها لضمان حماية العملية وارتباط عمليات الحذف مع بعضها في حال حدوث أي خطأ.

وبهذه الحالة تستطيع أيضاً في المستقبل إجراء أي تعديل على آلية الحذف دون أن يؤثر ذلك على بنية قاعدة البيانات أو الجداول والبيانات الموجودة فيها.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...