如何在Eloquent中过滤急切加载的表格?

时间:2015-05-19 23:02:43

标签: php laravel eloquent eager-loading

基本上,我希望能够检索用户并急切地加载电子邮件地址,然后使用where子句限制我带入的用户。

$query = User::with('emails')->whereIn ('user_id', $user_ids);

$query->where('emails.email_address', 'LIKE', "%example%");

$usersWithEmails = $query->get();

这有效:

$query->where('first_name', 'LIKE', "%test%");

这让我相信where子句只适用于基本用户对象,但我不想让那些与该电子邮件不匹配的用户。我知道我可以使用多个查询来执行此操作,但这是针对UI过滤器的,它们可以过滤许多子表,因此这样可以更好地工作。)

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以将with参数更改为关联数组,其中键是关系的名称,值是应用任何相关约束的闭包。

$query = User::with(['emails' => function ($query) {
    $query->where('emails.email_address', 'LIKE', '%example%');
}])->whereIn ('user_id', $user_ids);

您可以看到Eloquent's docs以获取更多信息,它是" Eager Loading"中的第一个项目符号点。

答案 1 :(得分:3)

如果您需要根据关系过滤用户,您要找的是whereHas

http://laravel.com/docs/5.0/eloquent#querying-relations

User::whereIn('id', [1, 3])->whereHas('emails', function ($query) {
  $query->where('emails.email_address', 'LIKE', '%example%');
})->with('emails');

这将:选择id = [1,3]的用户,然后过滤掉电子邮件模式不匹配的结果,然后加载结果行的关系。

使用whereHaswith Logan的示例)的不同之处在于后者将加载所有用户,但电子邮件字段将为空对于那些热切加载模式不匹配的地方。

当然你可以使用急切的加载限制来完成同样的事情,然后通过空字段过滤集合,但我觉得这个更干净。我让DB为我做的工作=)