Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

knubbe82's avatar

Query problem -> wrong data

I know a User but I need to get Seminars with that User and must use something like this: Seminar::with...

This is what I have:

$user = User::findOrFail($request->user_id);
            $seminars = Seminar::with(['users', 'meetings.users'])->whereHas('users', function ($query) use ($user) {
                $query->where('users.id', $user->id);
            })->get();

users and meetings.users are pivot

Problem that I have is 'I receive all users that participate in seminar that specific users also belongs'

How can I solve this?

0 likes
9 replies
cipsas's avatar

You can constrain eager loading:

$seminars = Seminar::with([ 'meetings.users'])->with(['users' => function ($query) use ($user) {
                $query->where('id', $user->id);
            }])->get();

knubbe82's avatar

@CIPSAS - This is not what I except. It's the same like my query but getting wrong date also

nsvetozarevic's avatar

So meetings table is pivot table between users and seminars. If so

$seminars = Seminar::with(['users' => function ($query) use ($user) {
                $query->where('id', $user->id);
});

In the last query you are getting only the seminars that the specified user participated, but with all of seminars users. This here would do the trick. And if you need some info from pivot table, you can get it like described in the docs section Retrieving Intermediate Table Columns

nsvetozarevic's avatar

I'm sorry think that you'll need to do it with ->whereHasToo() hence they're separate queries. So in the end I would try something like this

$seminars = Seminar::whereHas('users',function ($query) use ($user) {
                $query->where('id', $user->id);
})
->with(['users' => function ($query) use ($user) {
                $query->where('id', $user->id);
});
knubbe82's avatar

@NIKOS - I must have meetings and also meetings.users (meetings.users is pivot between users and meetings)

nsvetozarevic's avatar

Then just add meetings.users

$seminars = Seminar::whereHas('users',function ($query) use ($user) {
                $query->where('id', $user->id);
})
->with([
    'users' => function ($query) use ($user) {
                $query->where('id', $user->id);
    },
    'meetings.users'
]
);
knubbe82's avatar

@NIKOS - yes but meetings.users must also be like $query->where('meetings.users.id', $user->id) and that's not work

knubbe82's avatar
knubbe82
OP
Best Answer
Level 12

This is approach that works:

$seminars = Seminar::whereHas('users',function ($query) use ($user) {
                                            $query->where('users.id', $user->id);
                                          })->whereHas('meetings.users', function ($query) use ($user) {
                                            $query->where('user_id', $user->id);
                                            })->with([
                                            'users' => function ($query) use ($user) {
                                                $query->where('users.id', $user->id);
                                            },
                                            'meetings.users' => function ($query) use ($user) {
                                                $query->where('user_id', $user->id);
                                            }])->get();

Please or to participate in this conversation.