This is Part 2 of our Laravel 8 - Eloquent Relationships Tutorial
Let's start by creating the database table
php artisan make:migration create_comments_table
go to app/database/migrations:
Schema::create('comments', function (Blueprint $table) { $table->id(); $table->foreignId('student_id'); $table->string('comment'); $table->timestamps(); });
copy and save
run migration to create tables
php artisan migrate
check in your database if successful
Now let's create the model of comments
php artisan make:model Comment
models should be singular while the table is plural
One to Many Relationships
Go to app/Models and open the student model and the comment models
define the one to many relationship
in Models/Student.php
public function comment() { return $this->hasMany('App\Models\Comment'); }
in Models/Comment.php
protected $fillable = [ 'student_id', 'comment', ]; public function student() { // return $this->belongsTo('Model', 'foreign_key', 'owner_key'); return $this->belongsTo('App\Models\Student','student_id','id'); }
this will define the relationship between the two models
Create the Controllers and Routes
using the StudentController we made in part 1 lets create the function to create 3 comments under 1 student
go to app/Http/Controllers/StudentController
public function store_comment(){ $student = Student::find(1); $comment = new Comment; $comment->student_id = $student->id; $comment->comment = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the indust'; $comment->save(); $comment = new Comment; $comment->student_id = $student->id; $comment->comment = 'king it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydne'; $comment->save(); $comment = new Comment; $comment->student_id = $student->id; $comment->comment = 'ed to be sure there isnt anything embarrassing hidden in the middle of text. All the Latin words,'; $comment->save(); dd($comment); }
this is for example purposes of creating multiple comments only
create routes in app/routes/web.php
Route::get('/students/store/comment', [StudentController::class,'store_comment'])->name('storeComment');
in your browser go to http://localhost:8000/students/store/comment to create 3 entry in the database
it should look similar to:
Now change the index in StudentController to
public function index(){ $student = Student::find(1); dd($student->comment); }
go to http://localhost:8000/students to check the models
it should look similar to:
Hurray! We have successfully created our One to Many Relationship.
Now let's add queries when fetching our eloquent model
Fetching Students who have atleast 1 comment:
public function index(){ $student = Student::has('comment')->get(); dd($student); }
Result:
Fetching Students who doesn't have comments:
public function index(){ $student = Student::doesntHave('comment')->get(); dd($student); }
Fetching Students who have atleast 2 comments:
public function index(){ $student = Student::has('comment','>=',2)->get(); dd($student); }
Fetching a Student with all his/her comments in descending order:
$student = Student::where('id',1)->with(['comment' => function($query) { $query->orderBy('id','desc'); }])->get(); dd($student);
Result:
Accessing the comments only:
foreach ($student as $comment){ dd($comment->comment); }
Result:
Accessing only specific columns in a comment
Change the comment Models/Student to
public function comment() { return $this->hasMany('App\Models\Comment','student_id')->orderBy('id','desc'); }
then the code to get only specific column on a relation
$student = Student::where('id',1)->with(['comment:id,student_id,comment'])->get(); foreach ($student as $comment){ dd($comment->comment); }
Note: Primary Key id and Foreign Key student_id needs to be specificied for this to work
Get a student with a specific condition in the comments table:
$student = Student::whereHas('comment',function($query){ $query->where('comment','like','%king%'); })->get(); dd($student);
Get count of comments for each student
$student = Student::withCount('comment')->get(); dd($student);
Get count of comments for each student order by comment_count desc
$student = Student::withCount('comment')->orderBy('comment_count','desc')->get(); dd($student);
Get count of comments for each student with a specific critera
- get count of comments from students who have comments with the word king in it , result should only be 1
$student = Student::withCount(['comment' => function($query) { $query->where('comment','like','%king%'); }])->get(); dd($student);
Result:
Awesome we've completed lots of exercises!
Click this link to proceed with the next tutorial - Many to Many Relationship!
Top comments (2)
Thanks, this is nice tutorial
Thanks for your contribution.