【问题标题】:How do I filter on eagerly-loaded tables in Eloquent?如何在 Eloquent 中过滤急切加载的表?
【发布时间】:2015-05-19 23:02:43
【问题描述】:

基本上,我希望能够检索用户并急切地加载电子邮件地址,然后使用 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 过滤器,它们可以过滤许多子表,所以这样会更好)。

我该怎么做?

【问题讨论】:

    标签: php laravel eloquent eager-loading


    【解决方案1】:

    如果您需要根据关系过滤用户,您要查找的是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 的 示例)的区别在于,后者将加载所有用户,但电子邮件字段 WILL BE NULL 对于那些急切加载模式不匹配。

    当然,您可以使用急切加载限制,然后按空字段过滤集合来完成相同的操作,但我觉得这样更简洁。我让数据库为我完成这项工作 =)

    【讨论】:

    • 这是我一直在寻找的解决方案。 Logan Bailey 的回答有效,但我有很多过滤器可能想添加也可能不想添加,将它们全部放入 with 子句是不切实际的。谢谢!
    【解决方案2】:

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

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

    您可以查看Eloquent's docs 了解更多信息,这是“Eager Loading”中的第一个要点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多