Where子句使用Laravel中的Eloquent ORM来过滤来自三个相关表的行

时间:2017-08-31 12:48:23

标签: laravel eloquent laravel-5.3

我们有三个相关的模型:Event,User和EventType。

模型事件有一个用户,也有一个EventType。

现在,我们正在实现一个表(UI),可以由用户从Web浏览器中过滤。用户可以按事件类型,用户名(生成事件)以及IP地址等其他字段进行过滤。

IP地址存储在Events表中,但Events表有两个外键user_id和event_type_id。那么如何使用由特定用户生成且具有特定event_type的仅有说服力的事件进行过滤?

到目前为止,我们使用一个查询来检索具有特定名称的所有事件以及符合用户名搜索条件的所有用户。

然后使用whereIn子句构建第三个查询,按user_id和event_type_id进行过滤。

然而,这是三个问题。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

Event::whereHas('user', function($query){

   $query->where('users.name', 'Some Value');

})->whereHas('eventType', fucntion($query) {

   $query->where('event_types.field', '!=', 'Some other value');

})->where('ip', 'localhost)->get();

假设Event模型与User的关系称为user(),而EventType的关系称为eventType()。同样在嵌套whereHas查询中,我假设User表被称为usersEventType表被称为event_types。根据您的实际值相应地更改它们。

但是whereHas方法实际上是在执行查询,因此查询数量不会减少,但仍然是3.为了减少查询次数,join是要走的路:

Event::select('events.*)->join('users as u', 'events.user_id', 'u.id')
->join('event_types as et', 'events.event_type_id', 'et.id')
->where('u.username', 'like', "%$search%")
->where('et.slug', 'user.created')
->where('ip', 'localhost');