DEV Community

Cover image for Laravel relational database models
Chris Bongers
Chris Bongers

Posted on • Originally published at daily-dev-tips.com

Laravel relational database models

By now, we created a database in Laravel, and made our first seeder. Another great next step is to look into relational models.

So far, we have created a book model. Let's say we are going to introduce a category.
Each book will belong to one category, and a category can have many books.

Thinking in this way will help you determine which connection you will need.
Laravel does a super good way of documenting these.

Creating the category

First, let's start by creating a model and database by running the following command.

php artisan make:model Category --migration
Enter fullscreen mode Exit fullscreen mode

This will make a category model and create the migration for it.

Modify the migration to look like this.

Schema::create('categories', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});
Enter fullscreen mode Exit fullscreen mode

Then we also need to add the link to our book table.
Now there are two ways of doing this.

  1. Altering the migration we had
  2. Writing a new migration that will add this relation

Generally, I like to keep my migrations clean if there is no real-life data in them. If that is the case, do write a specific new migration.

In this case, since we are creating the relationship later, we can include the book change.
This is what the total migration will look like.

Schema::create('categories', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});
Schema::table('books', function (Blueprint $table) {
    $table->unsignedBigInteger('category_id')->nullable();
    $table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
});
Enter fullscreen mode Exit fullscreen mode

That adds a relation from the book database to the category database.

Don't forget the add the down function!

Schema::dropIfExists('categories');
Schema::table('book', function (Blueprint $table) {
    $table->dropForeign(['category_id']);
    $table->dropColumn('category_id');
});
Enter fullscreen mode Exit fullscreen mode

Defining the relationships in the models

It is very cool, and the database will be able to click through, but the real magic now comes in the models.

Let's start by altering the book model.
As mentioned in the intro, one book will belong to one category.

class Book extends Model
{
    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

That tells the book it belongs to a category. Laravel will do all of the magic for us from here.

Now on the category side, we have to say one category can have many books.

class Category extends Model
{
    public function books()
    {
        return $this->hasMany(Book::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

And that is literally all you need to make relations between models.

Let's run a new migration since we altered our existing migration.

php artisan migrate:fresh --seed
Enter fullscreen mode Exit fullscreen mode

I've added some demo data so you can see the relations work.

Laravel relationships

Can you create a seeder for the category part?
You can look at how I created the Book seeder in Laravel.

Thank you for reading, and let's connect!

Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter

Top comments (0)