Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('post_id')->constrained()->cascadeOnDelete();
$table->foreignIdFor(User::class)->nullable()->constrained()->nullOnDelete();
$table->timestamps();
});
foreignId('post_id')->constrained()- колонкаunsignedBigIntegerплюс обмеження наposts.id(таблицю Laravel виводить з назви колонки);foreignIdFor(User::class)- назву колонки бере з моделі.
Що буде з дітьми при видаленні батька - вирішують явно:
cascadeOnDelete()- видалити разом (коментарі поста);nullOnDelete()- обнулити посилання (автор видалив акаунт, коментар лишається анонімним; колонка має бутиnullable);restrictOnDelete()- заборонити видалення, поки є діти (клієнт із рахунками).
Що варто знати:
- обмеження працює на рівні бази й обходить Eloquent - події моделей для каскадно видалених рядків не спрацюють;
- м'яке видалення батька каскад не запускає - це звичайний
UPDATE; - MySQL сам створює індекс для зовнішнього ключа, PostgreSQL - ні, тож там індекс на
post_idдодають окремо; - видалити ключ:
$table->dropForeign(['post_id']).