親が物理削除でなく論理削除の場合は、データベース的には削除ではなく更新になるので、マイグレーションファイルに外部キー制約として削除時の設定を’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();
});
}
}