Always Eager loading Relationship in Laravel

As you must already know that at times if you don’t eager load your relationship models it can lead of N+1 query problem, This happens when you are trying to get property from a relationship model inside a Loop.

Laravel Eloquent provides with method to eager load your relationship when you are querying the object model.

Eager Load on Demand

For this example we will consider two models.

1. Posts

Livewire Component Library


Host Laravel Application on DigitalOcean

Use coupon 5balloons on this Cloudways Affiliate URL to get special discount.

A post can have many comments. Thus they Post will have hasMany relationship with Comments

public function comments(){

return $this->hasMany('App\Comments');


Thus, if you want to eager load the comments relationship along with Post, While querying the Post data you can do something like this

$posts = Post::with('comments')->latest()->get();

Always Eager Load

What if you decide in your application you always want to load comments along with Posts. This can be approaced in two ways.

1. Using $with property on Post Model

In your post Model, define a $with property, and declare the name of model that you always want to eager load.


namespace App;

use Auth;
use Illuminate\Database\Eloquent\Model;

class Reply extends Model

    use RecordsActivity;

    protected $guarded = [];

    protected $with = ['comments'];


Once this magic property is defined, comments associated with your post will always be loaded in your Post query.

Downside of this approach is that, you cannot turn this off for certain instances. Your post query will always load the comments data.

2. Using Global Scope

Second way of always eager loading the relationships is via Global Scopes,

Here is how you can define a global scope to always load the comments data along with Post


namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;

class Post extends Model

    protected $guarded = [];

    protected static function boot(){

        static::addGlobalScope('comments', function($builder){


With this approach you can turn off the loading of comments data when you don’t want it by using withoutGlobalScope method


That’s all about Eager Loading Relationship in Laravel.

Site Footer