Skip to main content

Command Palette

Search for a command to run...

Eloquent Relationships Tips Laravel

Updated
2 min read
Eloquent Relationships Tips Laravel
J

I'm a self-taught web developer who likes sharing my knowledge, helping people.

In this article, I'm going to share with you some tips that may help you.

  • Load Only the Columns You Need with Eager Loading
$products = Product::with('categories:id,name')->get();
  • Load Nested Relationship

Image this scenario: The user belongs to a country and this country has a city, meaning we have 3 tables related to each other. How we can access the city from user model?.

$users = User::with('country.city')->get();
  • Default Model

Sometimes you want to access a property from a relationship but this field can be null, for example {{$product->brand->name}}, if the name is null you receive a fatal error, to prevent that use default.

public function brand()
{
    return $this->belongsTo(Brand::class)->withDefault();
}
  • OrderBy

You can order your relationship by the field you need, for example

public function employees()
{
  return $this->hasMany(Employee::class);
}

//Order By
public function employees()
{
  return $this->hasMany(Employee::class)->orderBy('last_name');
}
  • Extra Fields in Pivot Table

In many to many relationships, we can define extra fields in the intermediate table like this

class User extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class)->withPivot('active');
    }
}
  • Rename Pivot Table

Sometimes you want to customize the name of your intermediate table, you can do it using as.

public function podcasts()
{
   return $this->belongsToMany(Podcast::class)
                ->as('subscription')
                ->withTimestamps();
}
  • Filter Relationship

You can use where to filter a relationship


public function active_users()
{
   return $this->hasMany(User::class)->where('active', 1);
}
  • whereRelation

From Laravel 8.57 we can use whereRelation, we can consider an improved version of whereHas

whereHas Example

$products = Product::whereHas('reviews', function ($query) {
    $query->where('stars', '>', 3);
})->get();

whereRelation Example

$products = Product::whereRelation('reviews', 'stars', '>', 3)->get();

If you have more tips leave them in the comment section to update the article.

Thanks for reading.

More from this blog

Code with Luis. Tutorials Laravel, Vuejs, and More.

27 posts