This is Part 1 of our Laravel 8 - Eloquent Relationships Tutorial
Setup:
Let's create the laravel app erd-app
composer create-project laravel/laravel erd-app cd erd-app
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(); });
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(); });
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'); }
in Models/Profile.php
protected $fillable = [ 'student_id', 'email', 'phone', ]; public function student() { return $this->belongsTo('App\Models\Student'); }
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); }
create routes in app/routes/web.php
Route::get('/students', [StudentController::class,'index'])->name('students'); Route::get('/students/store', [StudentController::class,'store'])->name('store');
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:
Now lets create 1 entry for the profile
create new route
Route::get('/students/store/profile', [StudentController::class,'store_profile'])->name('storeProfile');
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); }
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); }
go to http://localhost:8000/students to check
it should look similar to:
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'); }
Now let's access the profile from the student model
public function index(){ $student = Student::with('profile')->get(); dd($student); }
Result:
Click this link to proceed with the next tutorial - One to Many Relationship!
Top comments (0)