基本上,我希望能够检索用户并急切地加载电子邮件地址,然后使用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过滤器的,它们可以过滤许多子表,因此这样可以更好地工作。)
我该怎么做?
答案 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]的用户,然后过滤掉电子邮件模式不匹配的结果,然后加载结果行的关系。
使用whereHas
和with
( Logan的示例)的不同之处在于后者将加载所有用户,但电子邮件字段将为空对于那些热切加载模式不匹配的地方。
当然你可以使用急切的加载限制来完成同样的事情,然后通过空字段过滤集合,但我觉得这个更干净。我让DB为我做的工作=)