Foreign key gebruiken in Laravel

Foreign key gebruiken in Laravel
published 13-04-2022

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');
    }

Webbouwplus

Marcel van Doornen - Laravel Freelance developer
Marcel van Doornen, freelance Laravel developer. Ben je benieuwd hoe ik jou kan helpen?
Neem contact met mij op
©2025 Webbouw Plus