Blog Post

Eloquent Relationships: Building Complex Models

In Laravel, Eloquent provides a powerful way to build complex models by establishing relationships between different models. In this blog post, we'll ...

2025-10-03
4 min read
Avinash Tirumala

Eloquent Relationships: Building Complex Models

In Laravel, Eloquent provides a powerful way to build complex models by establishing relationships between different models. In this blog post, we'll explore various scenarios and provide examples of how to use Eloquent relationships.

Relationship Types

Eloquent supports several relationship types, including:

  • BelongsTo: A single model owns a related model.
  • BelongsToMany: A single model can have many relationships with another model.
  • HasMany: A model has many related models.
  • HasOne: A model has a single related model.

BelongsTo Relationship

The belongsTo relationship is used to establish a one-to-one relationship between two models. Here's an example:

// App\Users.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class User extends Model
{
    public function posts(): BelongsTo
    {
        return $this->belongsTo(Post::class);
    }
}
// app/Http Controllers/UserController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class UserController extends Controller
{
    public function show(User $user)
    {
        // Accessing related data using the relationship
        $post = $user->posts;

        return view('users.show', compact('user', 'post'));
    }
}

BelongsToMany Relationship

The belongsToMany relationship is used to establish a many-to-many relationship between two models. Here's an example:

// App\Users.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class User extends Model
{
    public function posts(): BelongsToMany
    {
        return $this->belongsToMany(Post::class);
    }
}
// app/Http Controllers/UserController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class UserController extends Controller
{
    public function show(User $user)
    {
        // Accessing related data using the relationship
        $posts = $user->posts;

        return view('users.show', compact('user', 'posts'));
    }
}

HasMany Relationship

The hasMany relationship is used to establish a one-to-many relationship between two models. Here's an example:

// App\Orders.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Order extends Model
{
    public function items(): HasMany
    {
        return $this->hasMany(Item::class);
    }
}
// app/Http Controllers\OrderController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\Item;

class OrderController extends Controller
{
    public function show(Order $order)
    {
        // Accessing related data using the relationship
        $items = $order->items;

        return view('orders.show', compact('order', 'items'));
    }
}

HasOne Relationship

The hasOne relationship is used to establish a one-to-one relationship between two models. Here's an example:

// App\Profiles.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Profile extends Model
{
    public function user(): HasOne
    {
        return $this->hasOne(User::class);
    }
}
// app/Http Controllers/profileController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Profile;
use App\Models\User;

class ProfileController extends Controller
{
    public function show(Profile $profile)
    {
        // Accessing related data using the relationship
        $user = $profile->user;

        return view('profiles.show', compact('profile', 'user'));
    }
}

Inverse Methods

To access related data from the opposite side of a relationship, you can use inverse methods. Here's an example:

// App\Users.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}
// app/Http Controllers/UserController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class UserController extends Controller
{
    public function show(User $user)
    {
        // Accessing related data using the inverse method
        $posts = $user->posts;

        return view('users.show', compact('user', 'posts'));
    }
}

Polymorphic Relations

Polymorphic relations allow you to establish a relationship between a model and another model, where the related data is stored in a polymorphic model. Here's an example:

// App\Orders.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Order extends Model
{
    public function item(): HasMany
    {
        return $this->hasMany(Item::class, ['as' => 'order']);
    }
}
// app/Http Controllers\OrderController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\Item;

class OrderController extends Controller
{
    public function show(Order $order)
    {
        // Accessing related data using the inverse method
        $item = $order->item;

        return view('orders.show', compact('order', 'item'));
    }
}

Relationship Validation

To validate relationships, you can use the validate method. Here's an example:

// App\Users.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class User extends Model
{
    public function post(): BelongsTo
    {
        return $this->belongsTo(Post::class)->validate(['name' => 'required']);
    }
}
// app/Http Controllers/UserController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function show(User $user)
    {
        // Accessing related data using the relationship
        $post = $user->post;

        return view('users.show', compact('user', 'post'));
    }
}

By understanding Eloquent relationships and how to use them effectively, you can build more complex models that interact with each other in meaningful ways.

Enjoyed this article?

If you found this post helpful, consider sharing it with your network or subscribing to my newsletter for more insights.

Eloquent Relationships: Building Complex Models - Avinash Tirumala | Avinash Tirumala