[Laravel 6.x]親子関係にある親テーブルのレコードが論理削除された時、紐づく子テーブルのレコードを物理削除したい

親が物理削除でなく論理削除の場合は、データベース的には削除ではなく更新になるので、マイグレーションファイルに外部キー制約として削除時の設定を’CASCADE’(参照先が無くなると同時に削除される)で記述をしただけでは、親テーブルのレコード削除時に子テーブルレコードは削除されません。

下記は親テーブルCompaniesにcompany_idで紐づくEmployeesテーブルです。

class CreateEmployeesTable extends Migration
{
  public function up()
  {
    Schema::create('employees', function (Blueprint $table) {
      $table->bigIncrements('id');
      $table->unsignedBigInteger('company_id');
      $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
      $table->string('name');
      $table->timestamps();
    }
  }
}

親テーブルのレコード削除時に子テーブルのレコードが削除されるよう、親テーブルのモデルファイルにコードを記述します。

class Company extends Model
{
  protected static function boot() 
  {
    parent::boot();
    self::deleting(function ($company) {
      $company->employees()->delete();
    });
  }
}
タイトルとURLをコピーしました