如何在没有特定相关实体的情况下获取所有实体?

时间:2017-04-23 18:28:07

标签: mysql sql laravel

我有这些表格:

用户

id 
name 

事件

id 
name

id
user_id
event_id

如何让所有没有event_id 4条目的用户

使用此代码:

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

我仍然会收到已经拥有该特定事件条目的用户。

这就是我想要的:

  • 获取所有包含event_id 4
  • 的条目
  • 从这些条目中获取user_id
  • 删除具有该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"
}

如何通过查询完成上述操作?

5 个答案:

答案 0 :(得分:0)

接下来的问题是答案,但我想这不是你最终想要的。如此详细,并指定样本输入和输出数据集

select * from your_table where event_id <> 4;

答案 1 :(得分:0)

您想要的SQL是:

select user_id
from t 
group by user_id
having sum(event_id = 4) = 0;

答案 2 :(得分: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

答案 3 :(得分:0)

您正在寻找<>,而不是!=。此外,您还不知道哪个表event_id正在使用。

尝试

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

可在https://laravel.com/docs/5.4/queries#where-clauses

找到更多信息

答案 4 :(得分:0)

您可以使用whereDoesntHave构建器方法。

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

该方法采用闭包,您可以在其中定义必须不存在的相关实体的条件。

如果您需要用户和条目,我认为您仍然可以使用with加入条目。

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