基本上,我希望能够检索用户并急切地加载电子邮件地址,然后使用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 回答
如果您需要根据关系过滤用户,您要找的是
whereHas
.http://laravel.com/docs/5.0/eloquent#querying-relations
这将:选择id = [1,3]的用户,然后过滤掉电子邮件模式不匹配的结果,然后加载结果行的关系 .
使用
whereHas
和with
( Logan's 示例)的区别在于,后者将加载所有用户,但电子邮件字段 WILL BE NULL 用于那些热切加载模式不匹配的用户 .当然,您可以使用急切的加载限制完成相同的操作,然后通过空字段过滤集合,但我发现这更清洁 . 我让DB为我做的工作=)
您可以将with参数更改为关联数组,其中键是关系的名称,值是应用任何相关约束的闭包 .
您可以看到Eloquent's docs以获取更多信息,它是"Eager Loading"中的第一个项目符号点 .