Laravel Eloquent被忽略的条款

时间:2016-05-26 18:45:33

标签: 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", "!=", "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("tasks.completed_at", null)

被忽略了。我是一名新手开发者,我不太明白为什么会这样。我认为该子句应该适用于它之前的所有逻辑。显然,我错了。

2 个答案:

答案 0 :(得分:2)

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

你应该在这种情况下对你的条件进行分组。在Eloquent中,可以使用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();

尝试并根据需要进行调整,如果我没有得到正确的顺序。

答案 1 :(得分:0)

您应该使用Eloquent语法。试试

->whereNull("tasks.completed_at")

验证该字段是否为NULL。