In dit artikel een uitleg hoe je een foreign key kan gebruiken in Laravel.
Als voorbeeld nemen we een verse Laravel installatie waar een blog functionaliteit aan toevoegen.
User verwijderen
Als we een user willen verwijderen willen we ook de blog post voor deze user verwijderen.
Natuurlijk zou je iets kunnen doen als
BlogPost::where('user_id', $id)->delete()l
Maar met een foreign key in de database kan je dit automatisch doen.
Maak een foreign key aan in een Laravel migration file
Schema::create('blog_posts', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->string('title');
$table->text('body');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
Als je nu een user zal verwijderen zullen de blog post voor deze user automatisch ook verwijderd worden.
Probleem, rollback
Stel je wil nog een wijziging doorvoeren in je migratie (of unit test runnen) en je voert het artisan commando:
php artisan migrate:rollback
uit, dan zal je de SQL fout krijgen:
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails
De oplossing
We moeten de ‘blog_posts’ SQL tabel dan eerder verwijderen dan de ‘users’ tabel.
Open de migratie file voor de users [date_time]_create_users_table.php en voeg daar de dropIfExists voor de blog_posts tabel toe boven de dropIfExists voor de users.
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('blog_posts');
Schema::dropIfExists('users');
}