سلام دوستان
من یه مشکلی دارم که وقتی ردیفی که دارای مدل فرزند هست را حذف میکنم اون ردیف مربوطه در مدل فرزند حذف نمیشه
مثلا جدول users یه رابط user_profile داره ولی وقتی کاربر را از users حذف میکنم ردیفش توی user_profile حذف نمیشه
Schema::create('user_profiles', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->unique();
$table->foreign('user_id')->on('users')->references('id')->onDelete('cascade');
$table->string('nationalCode', 10)->nullable();
$table->string('phone', 15)->nullable();
$table->string('mobile', 15)->nullable();
$table->timestamps();
});
توی config/database.php هم قسمت engine را به صورت زیر زدم
'engine' => 'InnoDB',
اینم قسمت حذف
public function destroy(User $user)
{
$user->delete();
toast('کاربر موردنظر با موفقیت حذف شد', 'success');
return redirect()->back();
}
چند تا راه وجود داره
1- (basic) ميتونيد خودتون تو كنترلر قبل از حذف user پروفايل اون يوزر رو پاك كنيد
2- متد delete رو در داخل مدل user بنويسيد (override كنيد) تا در زماني كه متد delete() رو كال ميكنيد روابطي كه ميخواييد رو هم پاك كنه
public function delete(){
// delete all associated
$this->user_profile()->delete();
// delete the parent
return parent::delete();
}
3- (راه حل رسمي) استفاده از event هاي eloquent ، در eloquent لاراول وقايعي رو تعريف كرده كه ميتونيد ست كنيد در زمان رخ داد هر كدوم چه اتفاقي بيوفته، يكي از اين وقايع deleting و یکی deleted هست،
تو اين روش باز چند تا راه داريد،
شما ميتونيد در داخل مدل یوزر dispatchesEvents رو به اين صورت تعريف كنيد
protected $dispatchesEvents = [
'deleted' => UserDeleted::class,
];
حالا هر كاربري كه حذف بشه بصورت اتوماتيك Event مربوطه كه اينجا UserDeleted::class هست (که باید خودتون بسازید) صدا زده ميشه
راه ديگه استفاده از observer ها هست كه چون اینجا فقط در مورد حذف کاربر صحبت میکنیم جاش نیست توضیح بدم.
و در ورژن 8 لاراول استفاده از كلوژر هم اضافه شده كه شما ميتونيد داخل مدل اينو تعريف كنيد و ديگه event listener جداگانه براش نسازيد
protected static function booted()
{
static::deleted(function ($user) {
$user->user_profile()->delete();
// ...
});
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟