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 <strong>Comments</strong> – http://127.0.0.1:8000/get-comments/1
Get <strong>Post detail</strong> – 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.
Read more