Laravel pivot: Get model from withPivot()

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Laravel Pivot Mastery: Getting Related Models via withPivot()

As senior developers working with Eloquent and relational databases, we often deal with complex many-to-many relationships. These relationships are managed through pivot tables, which store the metadata linking two models. While methods like withPivot() are incredibly useful for accessing raw pivot data, they sometimes lead to confusion when trying to fetch related model objects.

This post addresses a common stumbling block: how to leverage pivot data to pull in full records from related models, specifically addressing the scenario where you need information from the studyLevel model linked through a pivot table.

Understanding the Role of withPivot()

You’ve correctly identified that your setup involves a many-to-many relationship between User and Establishment, mediated by a pivot table containing columns like start, stop, and study_level_id.

When you use belongsToMany(), Laravel automatically maps these pivot columns when you use withPivot('column1', 'column2'). This method is designed to expose the specific data stored in the junction table, not necessarily to initiate a join that loads an entire related model.

In your initial attempt, trying to fetch the StudyLevel information directly through withPivot() only gives you the foreign key (study_level_id), which is just an ID. To get the actual StudyLevel object, we need to use Eloquent's powerful nested eager loading capabilities.

The Solution: Nested Eager Loading for Related Models

The key to solving this problem lies in understanding how Eloquent handles relationships when you eager load them. Instead of trying to force the pivot data to load a related model directly via withPivot(), we use dot notation within our main query to tell Eloquent exactly which relationships to load from the related models.

Since your relationship structure likely looks something like:
User $\longleftrightarrow$ Establishment (via pivot)
Establishment $\longleftrightarrow$ StudyLevel (where the pivot holds the link)

We need to chain these loads correctly. If we assume that the Establishment model has a relationship to StudyLevel, or if you can access the necessary keys through the pivot, nested loading is the perfect tool.

Let's refine your approach. We want the user's establishments, and for each establishment, we want the associated study level information.

Code Example: Loading Nested Data

If your relationships are set up correctly (e.g., User has establishments, and Establishment has a relationship to studyLevel), you can load everything in a single, efficient query:

php
$user = User::with(['establishments' => function ($query) use ($user) {
    // Load establishments first
    $query->withPivot('start', 'stop')
          ->with('studyLevel'); // Eager load the related studyLevel model here
}])->find($user_id);

Explanation:

  1. with(['establishments' => function ($query) { ... }]): We start by eager loading the establishments relationship on the User model.
  2. withPivot('start', 'stop'): Inside the closure, we use withPivot() to ensure the pivot columns (start, stop) are loaded alongside the establishment data. This is vital for accessing the junction table data.
  3. ->with('studyLevel'): Crucially, we then tell Eloquent to eagerly load the related studyLevel model for each of those establishments. Eloquent handles the necessary secondary joins automatically based on the defined relationships between your models.

This method ensures that when you iterate over $user->establishments, the associated study level data is already loaded, preventing N+1 query problems and providing you with full model objects instead of just raw IDs.

Conclusion

The confusion arises because withPivot() is a mechanism for accessing the junction table attributes, whereas loading related models requires leveraging Eloquent's standard eager loading syntax (with()). By combining both—using withPivot() for specific junction data and nested with() calls for full model relationships—you gain complete control over how you fetch complex relational data in Laravel. Mastering these techniques is fundamental to writing performant and readable code, which is why staying updated with the core concepts of frameworks like Laravel is so important.