Foreign key gebruiken in Laravel

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

Plaats een reactie