DEV Community

Cover image for Laravel 8- Eloquent Relationships  Tutorial - One to One Relationship
DaleLanto
DaleLanto

Posted on

Laravel 8- Eloquent Relationships Tutorial - One to One Relationship

This is Part 1 of our Laravel 8 - Eloquent Relationships Tutorial

Image description

Setup:
Let's create the laravel app erd-app

composer create-project laravel/laravel erd-app
cd erd-app
Enter fullscreen mode Exit fullscreen mode

open .env and connect to your local database
php artisan serve

Then create students and profiles databases
php artisan make:migration create_students_table

go to app/database/migrations:

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

copy and save

php artisan make:migration create_profiles_table

go to app/database/migrations:

Schema::create('profiles', function (Blueprint $table) {
            $table->id();
            $table->foreignId('student_id');
            $table->string('email');
            $table->string('phone');
            $table->timestamps();
        });
Enter fullscreen mode Exit fullscreen mode

copy and save

run migration to create tables
php artisan migrate
check in your database if successful

Now let's create the models student and profile
php artisan make:model Student
php artisan make:model Profile

models should be singular while the table is plural

One to One Relationships

Go to app/Models and open the two newly created models

define the one to one relationship
in Models/Student.php

protected $fillable = [
        'first_name',
        'last_name',
    ];

    public function profile()
    {
        return $this->hasOne('App\Models\Profile');
    }
Enter fullscreen mode Exit fullscreen mode

in Models/Profile.php

  protected $fillable = [
        'student_id',
        'email',
        'phone',
    ];

    public function student()
    {
        return $this->belongsTo('App\Models\Student');
    }
Enter fullscreen mode Exit fullscreen mode

this will define the relationship between the two models

Create the Controllers and Routes

php artisan make:controller StudentController

go to app/Http/Controllers/StudentController

use App\Models\Student;

...

public function index(){
        $stu = Student::find(1);
        dd($stu);
    }

    public function store(){
        $student = new Student;
        $student->first_name = 'Dale';
        $student->last_name = 'Lanto';
        $student->save();
        dd($student);
    }
Enter fullscreen mode Exit fullscreen mode

create routes in app/routes/web.php

Route::get('/students', [StudentController::class,'index'])->name('students');
Route::get('/students/store', [StudentController::class,'store'])->name('store');
Enter fullscreen mode Exit fullscreen mode

in your browser go to http://localhost:8000/students/store to create 1 entry in the database

go to http://localhost:8000/students to check the models

it should look similar to:

Image description

Now lets create 1 entry for the profile

create new route

Route::get('/students/store/profile', [StudentController::class,'store_profile'])->name('storeProfile');
Enter fullscreen mode Exit fullscreen mode

create new function in controller

public function store_profile(){

        $student = Student::find(1);

        $profile = new Profile;
        $profile->student_id = $student->id;
        $profile->email = 'dalelanto@gmail.com';
        $profile->phone = '7623423814';
        $profile->save();

        dd($profile);
    }
Enter fullscreen mode Exit fullscreen mode

go to http://localhost:8000/students/store/profile to create 1 entry in the database

update the index function by calling profile from student

public function index(){
        $student = Student::find(1);
        dd($student->profile);
    }
Enter fullscreen mode Exit fullscreen mode

go to http://localhost:8000/students to check

it should look similar to:

Image description

Hurray! We have successfully created our One to One Relationship.

For best practices it is best to include the foreign_key and local_key/owner_key in the model.

Let's go to Models/Profile.php and change the code to this

public function student()
    {
        // return $this->belongsTo('Model', 'foreign_key', 'owner_key'); 
        return $this->belongsTo('App\Models\Student','student_id','id');
    }

Enter fullscreen mode Exit fullscreen mode

Now let's access the profile from the student model

public function index(){
        $student = Student::with('profile')->get();
        dd($student);
    }
Enter fullscreen mode Exit fullscreen mode

Result:

Image description

Click this link to proceed with the next tutorial - One to Many Relationship!

Top comments (0)