Laravel 查询不使用 where 子句作为日期

Posted

技术标签:

【中文标题】Laravel 查询不使用 where 子句作为日期【英文标题】:Laravel query not using where clause for date 【发布时间】:2021-01-10 11:53:12 【问题描述】:

我做了一个 laravel 查询,它获取所有数据但不使用 $startdate 的 where 子句。

$user->studentGroups()->with([
            'GroupTasks' => function ($queryTwo) use ($startdate)

     return $queryTwo->where('start_date', '>', $startdate);  // THIS LINE IS NOT WORKING!!

    ])->with(['GroupTasks.prgressList' => function ($queryThree) use ($student_id)
     return $queryThree->where('progress_student_task_users.mis_id', $student_id); ,
        'GroupTasks.studentViews' => function ($queryfour) use ($student_id) return $queryfour->where('student_task_user_vieweds.mis_id', $student_id)->latest(); ,
    ])->get();

如果没有开始日期,它只会获取所有不是真正想法的数据。 知道如何解决吗?

【问题讨论】:

嗨 Sam,您有用于“$queryTwo”参数的原始查询吗? 这能回答你的问题吗? Laravel - Eloquent "Has", "With", "WhereHas" - What do they mean? @RobertYoung $queryTwo 只是查询构建器的一部分 【参考方案1】:

试试这个:

$user->studentGroups()
    ->with([
        'GroupTasks' => function ($query) use ($startdate, $student_id) 
            return $query->whereDate('start_date', '>', $startdate)
            ->with([
                'prgressList' => function ($query) use ($student_id) 
                    return $query->where('progress_student_task_users.mis_id', $student_id);
                ,
                'studentViews' => function ($query) use ($student_id) 
                    return $query->where('student_task_user_vieweds.mis_id', $student_id)->latest();
                ,
            ]);
        

    ])->get();

【讨论】:

不,我不断收到错误:未定义变量:student_id【参考方案2】:

如果我将 ->get() 移动到 where 子句之后,它会获取包括开始日期在内的数据,但不包括其余的 with !

$user->studentGroups()->with([
            'GroupTasks' => function ($queryTwo) use ($startdate)

     return $queryTwo->where('start_date', '>', $startdate);  // THIS LINE IS NOT WORKING!!

    ])->get() // ADD GET() HERE NOW WORKS

->with(['GroupTasks.prgressList' => function ($queryThree) use ($student_id)
         return $queryThree->where('progress_student_task_users.mis_id', $student_id); ,
            'GroupTasks.studentViews' => function ($queryfour) use ($student_id) return $queryfour->where('student_task_user_vieweds.mis_id', $student_id)->latest(); ,
    ])->get();

【讨论】:

【参考方案3】:

尝试改用whereDate()

return $queryTwo->whereDate('start_date', '>', $startdate)

另外,尝试将start_date 字段添加到您的GroupTask 模型中,如下所示:

protected $dates = [
    'start_date',
    'end_date'
];

您可以在此处阅读有关属性转换的更多信息:https://laravel.com/docs/8.x/eloquent-mutators#date-mutators

【讨论】:

我不认为它是日期,查看调试栏查询未使用语句中的 where 子句。 尝试提交第二个with()。第一个 with() 语句可能被第二个语句重载了。

以上是关于Laravel 查询不使用 where 子句作为日期的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何在 Laravel 中 MySQL 查询的 where 子句中使用数组 [重复]

多个where子句,Laravel

在 laravel 查询构建器中使用多个 where 子句

Laravel - 使用“with”和“where”子句进行选择的查询

Laravel 7 / SQL不区分大小写的where子句