Laravel Eloquent ORM (Object-Relational Mapper) Relationships

php dev.to

One-to-One Relationship:

users
id - integer
name - string

phones
id - integer
user_id - integer

In the User model:

public function phone()
{
   return $this->hasOne(Phone::class);
}
Enter fullscreen mode Exit fullscreen mode

In the Phone model:

public function user()
{
   return $this->belongsTo(User::class);
}
Enter fullscreen mode Exit fullscreen mode

One-to-Many Relationship:

posts
id - integer
name - string

comments
id - integer
post_id - integer

In the Post model:

public function comments()
{
     return $this->hasMany(Comment::class);
}
Enter fullscreen mode Exit fullscreen mode

In the Comment model:

public function post()
{
        return $this->belongsTo(Post::class);
}

Enter fullscreen mode Exit fullscreen mode

Many-to-many Relationship:

users
id - integer
name - string

roles
id - integer
name - string

role_user (Pivot table)
user_id - integer
role_id - integer

In User model

public function roles()
{
    return $this->belongsToMany(Role::class, 'role_user');
}
Enter fullscreen mode Exit fullscreen mode

In Role model:

public function users()
{
     return $this->belongsToMany(User::class, 'role_user');
}
Enter fullscreen mode Exit fullscreen mode

Important Note:

  • The pivot table is always singular; if you give it another name, make it plural.
  • The name of the pivot table is ordered alphabetically.
  • If the pivot table has more than two foreign keys, you use it as a normal table and create a model for it.

One-to-One (Polymorphic):
posts
id - integer
name - string

users
id - integer
name - string

images
id - integer
url - string
imageable_id - integer
imageable_type - string

In the Image model

public function imageable(): MorphTo
{
     return $this->morphTo();
}
Enter fullscreen mode Exit fullscreen mode

In the User model:

public function image(): MorphOne
{
    return $this->morphOne(Image::class, 'imageable');
}
Enter fullscreen mode Exit fullscreen mode

In the Post model:

public function image(): MorphOne
{
    return $this->morphOne(Image::class, 'imageable');
}
Enter fullscreen mode Exit fullscreen mode

One-to-Many (Polymorphic):
posts
id - integer
title - string
body - text

videos
id - integer
title - string
url - string

comments
id - integer
body - text
commentable_id - integer
commentable_type - string

In the Comment model:

public function commentable(): MorphTo
{
      return $this->morphTo();
}
Enter fullscreen mode Exit fullscreen mode

In the Video model:

public function comments(): MorphOne
{
     return $this->morphMany(Comment::class, 'commentable');
}
Enter fullscreen mode Exit fullscreen mode

In the Post model:

public function comments(): MorphOne
{
    return $this->morphMany(Comment::class, 'commentable');
}
Enter fullscreen mode Exit fullscreen mode

Many-to-Many (Polymorphic):
posts
id - integer
name - string

videos
id - integer
name - string

tags
id - integer
name - string

taggables
tag_id - integer
taggable_id - integer
taggable_type - string

In the Tag model:

public function videos(): MorphToMany
{
      return $this->morphedByMany(Video::class, 'taggable');
}

public function posts(): MorphToMany
{
     return $this->morphedByMany(Post::class, 'taggable');
}
Enter fullscreen mode Exit fullscreen mode

In the Video model:

public function tags(): MorphToMany
{
     return $this->morphToMany(Tag::class, 'taggable');
}
Enter fullscreen mode Exit fullscreen mode

In the Post model:

public function tags(): MorphToMany
{
     return $this->morphToMany(Tag::class, 'taggable');
}
Enter fullscreen mode Exit fullscreen mode

Has One Through Relationship:
The "has-one-through" relationship defines a one-to-one relationship with another model.
mechanics
id - integer
name - string

cars
id - integer
model - string
mechanic_id - integer

owners
id - integer
name - string
car_id - integer

In the Mechanic Model:

public function carOwner(): HasOneThrough
{
   return $this->hasOneThrough(Owner::class, Car::class);
}
Enter fullscreen mode Exit fullscreen mode

Has Many Through Relationship:
The "has-many-through" relationship defines a many-to-many relationship with another model.
projects
id - integer
name - string

environments
id - integer
project_id - integer
name - string

deployments
id - integer
environment_id - integer
commit_hash - string

In the Project Model:

public function deployments(): HasManyThrough
{
    return $this->hasManyThrough(Deployment::class, Environment::class);
}
Enter fullscreen mode Exit fullscreen mode

Source: dev.to

arrow_back Back to Tutorials