عدم حذف شدن پست ها با حذف یک کاربر

- 6 روز پیش
توسط علی بیات آپدیت شد
mt.rezaei ( 820 تجربه )
2 ماه پیش

سلام دوستان
من یه مشکلی دارم وقتی کاربری رو حذف میکنم پست های مربوط به اون کاربر نیز حذف میشن، چیکار کنم که این کار انجام نشه؟
چون تو جدول پست هام user_id کلید خارجی هست که اشاره داره به id در جدول یوزرها و مقدار ondelete(cascade) براش ست شده.
اگه این مقدار ست نشه درسته ولی وقتی ست نمیکنی خطا میده موقع حذف کردن

 Schema::create('posts', function (Blueprint $table) {  
      $table->increments('id');  
      $table->string('title');  
      $table->string('slug')->unique();  
      $table->text('meta_description')->nullable();  
      $table->text('body');  
      $table->string('tags');  
      $table->tinyInteger('status')->unsigned();  
      $table->integer('viewCount')->default(0);  
      $table->integer('commentCount')->default(0);  

      $table->unsignedInteger('user_id');
       $table->unsignedInteger('photo_id');
       $table->unsignedInteger('taxonomy_id');

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

          $table->timestamps();
    });
بهترین پاسخ انتخاب شده توسط mt.rezaei
علی بیات
2 ماه پیش

@mt.rezaei1989

کد migration تون رو به اشتراک بذارید.

علی بیات ( 75297 تجربه )
2 ماه پیش

@mt.rezaei1989

کد migration تون رو به اشتراک بذارید.

Alimotreb ( 54672 تجربه )
2 ماه پیش

سلام
@mt.rezaei1989

توی مایگریشن جایی که cascade زدید رو حذف کنید

mt.rezaei ( 820 تجربه )
2 ماه پیش

سلام
@ali.bayat
کد های مایگریشن رو در سوالی که پرسیدم گذاشتم

محمدحسن یگانه ( 169 تجربه )
2 ماه پیش

@mt.rezaei1989
سلام
معنی عبارت

onDelete('cascade')

دقیقا همین میشه که اگر user حذف شد تمام post هاش هم حذف بشه. حالا اگر خواسته باشید جلوی این کار رو بگیرید کافیه بجای cascade عبارت set null قرار بدید. یعنی:

->onDelete('set null');

با اینکار اگر user حذف شد تمام پست های مربوط به اون در ستون‌ user_id مقدار null میگیرند ولی حذف نمی‌شوند. فقط خاطر جمع بشید که user_id تون از نوع nullable() تعریف بشه. یعنی باید اینجور بشه:

$table->unsignedInteger('user_id')->nullable();

https://stackoverflow.com/q/20869072

mahdi khanzadi ( 5532 تجربه )
2 ماه پیش

بهترین پاسخ رو واقعا بجا و مناسب انتخاب کردین! :-D

mt.rezaei ( 820 تجربه )
2 ماه پیش

@mhyeganeh
سلام با تشکر از پاسختون
ولی اینکار اشتباهه و وقتی به عنوان مثال وقتی پستی که مربوط به کاربری باشه که حذف شده ان کاربر و user_id آن null شده است موقع نمایش پست های مربوط به کاربر اگر بخواهیم نویسنده پست را نمایش دهیم خطا میدهد چون نویسنده را نمیتواند پیدا کند
این مورد برای دسته بندی ها هم صدق میکند...

علی بیات ( 75297 تجربه )
1 ماه پیش

@mt.rezaei1989
اگر با onDelete('cascade') دز لاراول مشکل دارید٬ میتونید این کار رو بصورت دستی هم انجام بدید.
از Model Events استفاده کنید.
http://www.mattmorgante.com/technology/laravel-model-events

حتی از Event های عادی هم میتونید استفاده کنید

web developer ( 512 تجربه )
1 هفته پیش

سلام
@ali.bayat
@hesammousavi
من هم همین مشکل را دارم، ممنون میشوم راه درست را بفرمایید.
گزینه onDelete('cascade') همه زو پاک میکنه و اگر نباشد خطای زیر داده میشود:

Cannot delete or update a parent row: a foreign key constraint fails 
علی بیات ( 75297 تجربه )
6 روز پیش

@soheilsaghian
مایگریشن هارو چک کردید؟

برای ارسال پاسخ باید وارد سایت شوید