【问题标题】:Laravel Eager loading with nested OR conditionLaravel Eager 加载嵌套 OR 条件
【发布时间】:2014-10-29 10:52:30
【问题描述】:
$query = LeadsModel::with(
                            array(
                                    'emails' => function ($q) use ($inputs) 
                                    {
                                        $q->orwhere('email','like',"%john%");
                                        $q->orwhere('email','like',"%mark%");
                                    }
                                )
                            )
                            ->whereHas
                            (
                                'emails', function ($q) use ($inputs) 
                                {
                                    $q->orwhere('email','like',"%john%");
                                    $q->orwhere('email','like','%mark%');
                                }
                            );

    $res = $query->get();

    display_output($res);
    return;

上面的代码只返回所有记录,没有条件应用于结果。我不确定出了什么问题。我想要的是在查询中为与父关联的子表添加条件,但将返回应用条件的父子数据

其他问题:

  • 如何在预加载的嵌套条件中添加多个 OR 条件?
  • 如何控制条件的优先级?假设我将有 2 或 3 个条件具有相同的优先级,并且在嵌套的急切加载条件中我将有另一个带有 AND 条件的条件

更新

这仍然记录所有数据,不应用任何条件。

    $query = LeadsModel::with(
                            array(
                                    'emails' => function ($q) use ($inputs) 
                                    {
                                        $q->orWhere('email','like',"%john%");
                                        $q->orWhere('email','like',"%james%");
                                    }
                                )
                            )
                            ->whereHas
                            (
                                'emails', function ($q) use ($inputs) 
                                {
                                    $q->where('email','like',"%john%")->orWhere('email','like','%james%');
                                }
                            );

    $res = $query->get();

    display_output($res);
    return;

在正常的 sql 中我猜是

选择潜在客户。,lead_detail_emails。 从潜在客户,lead_detail_emails 中 Leads.id =lead_detail_emails.lead_id 和 (lead_detail_emails.email like '%john%' OR lead_detail_emails.email like '%james%');

【问题讨论】:

  • 你应该添加一些你想要实现的例子/代码
  • 我已经更新了我的问题。谢谢
  • 请解释您想从数据库中获取的确切记录 - 现在您似乎想要获取包含 john 或 james 等电子邮件的leadsmodel 记录,并为他们获取也只有名称 john 或的相关模型电子邮件詹姆斯。
  • 我想从潜在客户(电子邮件表的父级)获取记录,条件是搜索 john 或 james 电子邮件
  • @Ponce 您对查询的猜测是错误的,请查看我编辑的答案以了解详细信息。

标签: php laravel eloquent eager-loading query-builder


【解决方案1】:

你需要嵌套在哪里:

whereHas('emails', function ($q)
{
    $q->where(function ($q) {
      $q->where('email','like',"%john%")
        ->orWhere('email','like','%mark%');
    });
})

这是使用数据透视表 (@​​987654323@) 查询 whereHas 的示例:

select * from `table` 
    where `table`.`deleted_at` is null 
        and (select count(*) from `related_table` inner join `pivot_table` on `related_table`.`id` = `pivot_table`.`related_id` 
    where `pivot_table`.`user_id` = `table`.`id` 
        and (`some_field` like ? or `some_field` like ?)) >= 1

【讨论】:

  • 该代码在不应用条件的情况下返回所有记录。我已经用完整的急切加载更新了问题。
  • 对不起,我在上面的评论中犯了错误。这只会返回 John 的记录。
  • @Ponce 你说它会忽略第二个 where,这是不正确的。因此,请检查您的期望和实际结果。这就是你需要的。
  • 我需要 john 或 james 的结果。我添加了一个 sql 查询,可能是这样的。
  • 我知道你的代码,但你确定吗?您是否检查过执行的查询并将其结果与数据库中运行的相同查询进行比较,在框架之外,所以您说它忽略了任何东西? 这仅返回 XYZ 可能为真,因为没有其他行可返回,而查询正常。
猜你喜欢
  • 2020-05-23
  • 2019-08-10
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多