سلام دوستان
من یه مشکلی دارم وقتی کاربری رو حذف میکنم پست های مربوط به اون کاربر نیز حذف میشن، چیکار کنم که این کار انجام نشه؟
چون تو جدول پست هام 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.rezaei1989
سلام
معنی عبارت
onDelete('cascade')
دقیقا همین میشه که اگر user حذف شد تمام post هاش هم حذف بشه. حالا اگر خواسته باشید جلوی این کار رو بگیرید کافیه بجای cascade عبارت set null قرار بدید. یعنی:
->onDelete('set null');
با اینکار اگر user حذف شد تمام پست های مربوط به اون در ستون user_id مقدار null میگیرند ولی حذف نمیشوند. فقط خاطر جمع بشید که user_id تون از نوع nullable() تعریف بشه. یعنی باید اینجور بشه:
$table->unsignedInteger('user_id')->nullable();
@mhyeganeh
سلام با تشکر از پاسختون
ولی اینکار اشتباهه و وقتی به عنوان مثال وقتی پستی که مربوط به کاربری باشه که حذف شده ان کاربر و user_id آن null شده است موقع نمایش پست های مربوط به کاربر اگر بخواهیم نویسنده پست را نمایش دهیم خطا میدهد چون نویسنده را نمیتواند پیدا کند
این مورد برای دسته بندی ها هم صدق میکند...
@mt.rezaei1989
اگر با onDelete('cascade') دز لاراول مشکل دارید٬ میتونید این کار رو بصورت دستی هم انجام بدید.
از Model Events استفاده کنید.
http://www.mattmorgante.com/technology/laravel-model-events
حتی از Event های عادی هم میتونید استفاده کنید
سلام
@ali.bayat
@hesammousavi
من هم همین مشکل را دارم، ممنون میشوم راه درست را بفرمایید.
گزینه onDelete('cascade') همه زو پاک میکنه و اگر نباشد خطای زیر داده میشود:
Cannot delete or update a parent row: a foreign key constraint fails
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟