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.