Laravel 10 One to Many Eloquent Relationship Tutorial

Reading Time: 7 minutes
895 Views

Database relationships are an essential component of web application development, allowing you to efficiently model complicated data structures. The one-to-many relationship, in which one entry in one table is related with several records in another table, is one of the most common.

One-to-Many Eloquent Relationship is a type of database relationship in which one model is associated with multiple instances of another model. In this type of relationship, a single record from one table (parent model) has many related records in another table (child model).

Laravel, a powerful PHP framework, makes it easier to construct such associations with its Eloquent ORM. In this tutorial, we will walk you through the process of constructing a one-to-many Eloquent connection in Laravel 10, allowing you to manage and retrieve related data from your database more quickly.

Read More: Laravel 10 One to One Eloquent Relationship Tutorial

For this tutorial we will consider a posts table and a comments table. This means a single post can have multiple comments.

Let’s get started.

Laravel Installation

Open terminal and run this command to create a laravel project.

composer create-project laravel/laravel myblog

It will create a project folder with name myblog inside your local system.

To start the development server of laravel –

php artisan serve

URL: http://127.0.0.1:8000

Assuming laravel already installed inside your system.

Create Database & Connect

To create a database, either we can create via Manual tool of PhpMyadmin or by means of a mysql command.

CREATE DATABASE laravel_app;

To connect database with application, Open .env file from application root. Search for DB_ and update your details.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_app
DB_USERNAME=root
DB_PASSWORD=root

Setup Migrations for One-to-Many Relationship

You need to create two migration files,

  • Migration file for Posts table
  • Migration file for Comments table

Open project terminal and run these migration commands,

php artisan make:migration CreatePostsTable

php artisan make:migration CreateCommentsTable

It will create two files xxx_create_posts_table.php & xxx_create_comments_table.php inside /database/migrations folder.

Read More: Laravel 10 Call MySQL Stored Procedure Example Tutorial

Open xxx_create_posts_table.php and write this complete code into it,

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string("title");
            $table->text("description")->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Next,

Open xxx_create_comments_table.php and write this code into it,

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up(): void
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->id();
            $table->foreignId('post_id')->constrained('posts');
            $table->string("comment");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::dropIfExists('comments');
    }
};

Run Migrations

Next, need to migrate migrations.

php artisan migrate

This command will create tables inside database.

Next,

Create Model & Add One-to-Many Relationship with Inverse

Back to project terminal and run these artisan commands,

php artisan make:model Post

php artisan make:model Comment

This command will create two files Post.php and Comment.php inside /app/Models folder.

Open Post.php and write this complete code into it.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Models\Comment;

class Post extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        "title", 
        "description"
    ];

    /**
     * Get the comments for the blog post.
     */
    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class);
    }
}

$this->hasMany(Comment::class); This means that one Post can have many comments. This is establishing One-To-Many Relationship.

Read More: Laravel 10 FullCalendar Ajax CRUD Tutorial Example

Usage

$comments = Post::find(1)->comments;

Inverse Relationship One-To-Many

Open Comment.php model file and write this complete code into it,

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use App\Models\Post;

class Comment extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        "post_id",
        "comment"
    ];

    /**
     * Get the post that owns the comment.
     */
    public function post(): BelongsTo
    {
        return $this->belongsTo(Post::class);
    }
}

$this->belongsTo(Post::class); This means a comment has a associated post with it. This is establishing Inverse of One-To-Many Relationship.

Usage

$comment = Comment::find(1);

How To Use Relations in Laravel Controller?

Open any controller say DataController.php file from /app/Http/Controllers folder.

Here, you can see two methods in which we used model methods as a property.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;
use App\Models\Comment;

class DataController extends Controller
{
    public function getComments($post_id)
    {
        // Passing post id into find()
        return Post::find($post_id)->comments;
    }

    public function getPost($comment_id)
    {
        // Passing comment id into find()
        return Comment::find($comment_id);
    }
}

Explanation,

  • Post::find($post_id)->comments; It will find comments detail values by post id. One to Many
  • Comment::find($comment_id)->post; It will find post detail by comment id. Inverse of One to Many / Belongs To

Add Routes

Open web.php from /routes folder and add these routes into it,

//...

use App\Http\Controllers\DataController;

Route::get('get-comments/{id}', [DataController::class, 'getComments']);
Route::get('get-post/{id}', [DataController::class, 'getPost']);

//...

Application Testing

Run this command into project terminal to start development server,

php artisan serve

Test URLs

Get Comments – http://127.0.0.1:8000/get-comments/1

Get Post detail – http://127.0.0.1:8000/get-post/1

That’s it.

We hope this article helped you to learn about Laravel 10 One to Many Eloquent Relationship Tutorial in a very detailed way.

If you liked this article, then please subscribe to our YouTube Channel for PHP & it’s framework, WordPress, Node Js video tutorials. You can also find us on Twitter and Facebook.