首页 文章

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

提问于
浏览
1

基本上,我希望能够检索用户并急切地加载电子邮件地址,然后使用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 回答

  • 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]的用户,然后过滤掉电子邮件模式不匹配的结果,然后加载结果行的关系 .

    使用 whereHaswithLogan's 示例)的区别在于,后者将加载所有用户,但电子邮件字段 WILL BE NULL 用于那些热切加载模式不匹配的用户 .

    当然,您可以使用急切的加载限制完成相同的操作,然后通过空字段过滤集合,但我发现这更清洁 . 我让DB为我做的工作=)

  • 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"中的第一个项目符号点 .

相关问题