How to query relation of pivot in laravel?
10:18 05 Jan 2026

Perhaps a bit oddly, with rapid business growth, some relationships between tables now require a review/approval process. However, at the project's inception, we didn't reserve a dedicated review status field within the relevant tables. Now, as a lot of content requires review, we've decided to add a new reviews table and use Eloquent's Polymorphic Relations (morph) to link it to the models that need reviewing. We've also created a Reviewable Trait, which quickly and effectively implemented the core requirement.

However, a problem has arisen: I'm unsure how to correctly query the intermediate/junction table based on the review status.

For example, we have users and roles tables, which are linked by an intermediate table, user_role_assigns.

The act of linking (the assignment itself) requires review and should be invisible to others until it is approved. The user_role_assigns table is the one that has the morph relationship to the reviews table via the Reviewable trait. My question is: how can I write a query to retrieve, for example, a user's roles, but only include the roles where the corresponding assignment record in user_role_assigns has been approved?

Currently, my code looks like this:

User::query()
    ->whereHas('roles', function (Builder $query) use ($isQueryCurrentUser) {
        if ($isQueryCurrentUser) {
            // this ok
            $query->with([
                'assigns' => function (Builder $query) {
                    $query->with(['review']);
                },
            ]);
        } else {
            // problem in here, assigns includes all assigns
            // so if someone assigned, will be included in result, show to others, this is wrong
            // but in query can't access attributes, don't know how to filter for current user list
            $query->whereHas('assigns', function (Builder $query) {
                $query->whereHas('review', function (Builder $query) {
                    $query->where('status', 'approved');
                });
            });
        }
    })
    ->get();
php laravel eloquent