简体   繁体   中英

How can I get all entities without a specific related entity?

I have these tables:

users

id 
name 

events

id 
name

entries

id
user_id
event_id

How can I get all users that do not have an entry with event_id 4?

With this code:

 $users = User::query();
 $users->leftJoin('entries', 'users.id', '=', 'entries.user_id')
       ->where('event_id','!=', $event_id)->get();

I still get users that already have an entry for that specific event.

This is what I want:

  • Get all entries which have event_id 4
  • Get the user_id from those entries
  • Remove other entries which have that user_id.

$entries = Entry::where(event_id, '=', 4)->get();

foreach ($entries as &$entry) {
    //remove all entries from $entries array which "user_id = $entry->user_id"
}

How can I do the above with just a query?

Going by your question following is the answer but i guess this is not what you finally want. so elaborate more and specify the sample input and output datasets

select * from your_table where event_id <> 4;

The SQL you want is:

select user_id
from t 
group by user_id
having sum(event_id = 4) = 0;
select u.*
  from User u
  left join entries e
  on e.user_id = u.id and e.event_id = 4
  where e.id is null

You're looking for <> , not != . Also you're not letting it know which table event_id is on.

Try

 $users = User::query();
 $users->leftJoin('entries', 'users.id', '=', 'entries.user_id')
       ->where('entries.event_id','<>', $event_id)->get();

More information can be found at https://laravel.com/docs/5.4/queries#where-clauses

You can use the whereDoesntHave builder method.

$users = User::query()->whereDoesntHave("entry", function($q) use ($event_id) {
    $q->where('id', $event_id);
})->get();

The method takes a closure in which you can define criteria for the related entities that must not exist.


If you need the users and the entries, I think you can still join the entries using with .

$users = User::query()
    ->with('entries')
    ->whereDoesntHave("entry", function($q) use ($event_id) {
        $q->where('id', $event_id); })
    ->get();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM