In this chapter, we will learn how to use laravel eloquent One To One relationship. I am using the latest version of the Laravel Framework which is 6.2. It needs PHP version 7.2.0 or higher. You can easily join tables with laravel eloquent relationships. So let’s get started.
Post Contents
# Requirements
- Laravel installed in your system. Click Here to know how to install Laravel Framework
- Composer installed in your system.
One To One Relationship is a basic relation between two models. Lets take an example with two models Employee and Job. Every employee has one job.
# Create models with migrations
Go to PHP project directory and use the following command to install Employee and Job model and migrations.
php artisan make:model Employee -m
php artisan make:model Job -m
Using -m option will automatically create migration for model in database > migration folder
In Employee model and replace below code.
/* app > Employee.php */
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Employee extends Model
{
protected $fillable = ["name", "email"];
}
Likewise, In Job model and replace below code.
/* app > Job.php */
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Job extends Model
{
protected $fillable = ["employee_id", "name_of_company"];
}
# Create Database Schema In Migrations
/* database > migrations > *_create_employees_table.php */
public function up()
{
Schema::create('employees', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email');
$table->timestamps();
});
}
Open jobs table migration and replace below code into it
/* database > migrations > *_create_jobs_table.php */
public function up()
{
Schema::create('jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('employee_id');
$table->string('name_of_company');
$table->timestamps();
$table->foreign('employee_id')->references('id')->on('employees');
});
}
Migrate two tables with following command. This will create two tables in database.
php artisan migrate
# Generating dummy data with faker
Its a good practice to create a dummy data. Create EmployeeAndJobSeeder with following command.
php artisan make:seeder EmployeeAndJobSeeder
Above command will automatically create seeder in database > seeds folder.
Update below code in DatabaseSeeder.php.
/* database > seeds > DatabaseSeeder.php */
public function run()
{
$this->call(EmployeeAndJobSeeder::class);
}
Furthermore in EmployeeAndJobSeeder.php and replace below code. I’m using faker package to generate dummy data. Below code will create 10 records. You generate even more as you want.
/* database > seeds > EmployeeAndJobSeeder.php */
<?php
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use App\Employee;
use App\Job;
class EmployeeAndJobSeeder extends Seeder
{
public function run()
{
$faker = Faker::create();
foreach(range(1, 10) as $index)
{
$employee = Employee::create([
'name' => $faker->name,
'email' => $faker->safeEmail
]);
Job::create([
'employee_id' => $employee->id,
'name_of_company' => $faker->company,
]);
}
}
}
Using below command you will get dummy records in employees and jobs table
php artisan db:seed
# Defining Relationship
Finally, we are ready to define laravel eloquent one to one relationship between Employee and Job models.
First of all, define job function (take any name you want) with hasOne method in Employee Model. Every One To One relation must have hasOne method connected to his related model.
/* app > Employee.php */
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Employee extends Model
{
protected $fillable = ["name", "email"];
public function job()
{
return $this->hasOne('App\Job');
}
}
Similarly in Job model define employee function (you can take any name you want) with belongsTo method in it. That is inverse relationship.
/* app > Job.php */
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Job extends Model
{
protected $fillable = ["employee_id", "name_of_company"];
public function employee()
{
return $this->belongsTo('App\Employee');
}
}
Thats It! You created one to one relationship between Employee and Job model. You just need to remember hasOne and belongsTo functions defined in models.
# Usage
Suppose if you have employee object and you want to find job of the employee then you can use hasOne function defined in Employee model.
$employee = App\Employee::find(1);
$employee->job->name_of_company;
If you have job object and you want find employee then you can use belongsTo function defined in Job model.
$job = App\Job::find(1);
$job->employee->name;
One of the best tutorials for laravel for beginners. Thank you
This is very helpful for beginners to understand and learn easily because of it follows steps and also highlights points which are important.