2017-04-23 62 views
0

我有这些表:如何获得没有特定相关实体的所有实体?

用户

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" 
} 

我该怎么做上面只是一个查询?

+0

您是否创建了模型之间的所有关系? – lewis4u

+0

是的,但我不想使用With方法。 – user2909494

+0

为什么你不想使用方法?它有什么问题? – lewis4u

回答

0

去你的问题以下是答案,但我想这不是你最终想要的。所以更多的阐述,并指定采样的输入和输出数据集

select * from your_table where event_id <> 4; 
0

你想要的SQL是:

select user_id 
from t 
group by user_id 
having sum(event_id = 4) = 0; 
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 
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

+1

'<>'和'!='在大多数数据库中具有相同的功能,更具体地说,在'MySQL'中。 –

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(); 
相关问题