Php Laravel雄辩的where子句被忽略

Php Laravel雄辩的where子句被忽略,php,laravel,eloquent,Php,Laravel,Eloquent,我有以下疑问: $owned = ['leads.user_id' => $this->crmUser->id, "leads.delegated_user_id" => null]; $delegated = ['leads.delegated_user_id' => $this->crmUser->id]; $leads = \Lead::where($owned) ->where("leads.status", "!=",

我有以下疑问:

$owned = ['leads.user_id' => $this->crmUser->id, "leads.delegated_user_id" => null];
$delegated = ['leads.delegated_user_id' => $this->crmUser->id];

$leads = \Lead::where($owned)
        ->where("leads.status", "!=", "Archived")
        ->orWhere($delegated)
        ->where("leads.status", "!=", "Archived")
        ->rightJoin("tasks", "tasks.lead_id", "=", "leads.id")

        ->where('tasks.due_date', '<', date("F j, Y", strtotime('-10 days')))
        ->where("tasks.completed_at", null)
        ->get()->toArray();

    \Log::debug(var_export($leads, true));

正在被忽视。我是一个新手开发人员,我真的不明白为什么会这样。我认为该条款应适用于它之前的所有逻辑。显然我错了。

有很多条件(有些重复),我不确定它们应该以什么顺序应用。我的猜测是数据库服务器也有困难

在这种情况下,你应该将你的情况分组。在where()方法中,可以使用匿名函数实现有说服力的分组。如果您想将最后一个条件应用于它之前的所有条件,您可以执行以下操作:

\Lead::rightJoin("tasks", "tasks.lead_id", "=", "leads.id")
    ->where(function($q) use ($owned, $delegated)
    {
        $q->where($owned)
            ->orWhere($delegated)           
            ->where("leads.status", "!=", "Archived")
            ->where('tasks.due_date', '<', date("F j, Y", strtotime('-10 days')));
    })
    ->where("tasks.completed_at", null)
    ->get()->toArray();
\Lead::rightJoin(“任务”、“任务.Lead\u id”、“=”、“leads.id”)
->其中(功能($q)使用($owned,$Delegate)
{
$q->where($owned)
->orWhere($委托)
->其中(“Lead.status”、“!=”、“存档”)

->where('tasks.due_date','有很多条件(有些重复),我不确定它们应该以什么顺序应用。我猜数据库服务器也很困难

您应该在这样的情况下对条件进行分组。在这种情况下,可以使用where()方法中的匿名函数来实现雄辩的分组。如果您希望将最后一个条件应用于它之前的所有条件,您可以执行以下操作:

\Lead::rightJoin("tasks", "tasks.lead_id", "=", "leads.id")
    ->where(function($q) use ($owned, $delegated)
    {
        $q->where($owned)
            ->orWhere($delegated)           
            ->where("leads.status", "!=", "Archived")
            ->where('tasks.due_date', '<', date("F j, Y", strtotime('-10 days')));
    })
    ->where("tasks.completed_at", null)
    ->get()->toArray();
\Lead::rightJoin(“任务”、“任务.Lead\u id”、“=”、“leads.id”)
->其中(功能($q)使用($owned,$Delegate)
{
$q->where($owned)
->orWhere($委托)
->其中(“Lead.status”、“!=”、“存档”)

->其中('tasks.due_date','您应该使用雄辩的语法。试试看

->whereNull("tasks.completed_at")

要验证该字段是否为空。

您应该使用雄辩的语法。请重试

->whereNull("tasks.completed_at")

验证该字段是否为空。

尝试查看从该字段生成的有说服力的查询:dd(\Lead::where()->…*将所有条件放到get()此处*…->toSql());“从“leads”中选择*右键连接“tasks”上的“tasks”。“Lead\u id”=“leads”。“id”其中(“leads”。“user\u id”=?和“leads”。“Delegate\u user\u id”为空)和“leads”。“leads”。“状态”!=?或(“潜在客户”,“授权用户id”和“潜在客户”,“状态”和“任务”,“到期日”和“任务”,“完成时间”NULL“我仍然不明白它为什么包括那些记录……什么是$委托?或者应该在哪里取两个参数,你没有漏掉任何东西吗?它是一个数组。我已经编辑了我原来的问题,把它包括进去。考虑使用<代码> WHONEUL而不是一个普通的<代码> < < /Cord>”。这是:dd(\Lead::where()->…*将所有条件放到get()这里*…->toSql());“从“leads”中选择*右键加入“tasks”上的“tasks”。“Lead\u id”=“leads”。“id”其中(“leads”。“user\u id”=?和“leads”。“delegated\u user\u id”为空)和“leads”。“status”!=?或(“leads”。“delegated\u user\u id”=?)和“leads”。“status”!“tasks”;“到期日”<?和“任务”。“已完成”NULL“我仍然不明白为什么它包括这些记录……什么是$委托?或者应该在哪里取两个参数,你没有漏掉任何东西吗?它是一个数组。我已经编辑了我原来的问题,包括它。考虑使用<代码> WHONEUL< /COD>而不是一个普通的< <代码> < < /C> >。谢谢,但是这引起了无限循环。函数应该是匿名的?是的,它必须是匿名的。不应该有无限循环,因为没有循环或递归。你到底得到了什么错误?你刚刚在内部查询中漏掉了一个分号。我试图更正,但stackoverflow要求编辑至少6个字符。对我的用例稍作调整后,t他的成功了。非常感谢你,塔达斯。谢谢,但这导致了一个无限循环。函数应该是匿名的吗?是的,它必须是匿名的。不应该有无限循环,因为没有循环或递归。你到底得到了什么错误?你刚刚在内部查询中漏掉了一个分号。我试图更正,但stackoverflow需要s编辑为至少6个字符。对我的用例进行了一点调整,这就成功了。非常感谢你,塔达斯。这没有解决问题,但我同意。谢谢。这没有解决问题,但我同意。谢谢。