1
SELECT
    *
FROM
    sub_task_information st
WHERE
    created_at = (
        SELECT MAX(created_at) 
       FROM sub_task_information st2 
       WHERE st2.sub_task_id = st.sub_task_id 
             AND st2.user_id = st.user_id
    )

需要帮助将此原始查询转换为雄辩的模型 SubTaskInfo?

4

1 回答 1

0

您可以使用 shell 轻松测试查询,tinker甚至无需访问您的数据库。只需使用->toSql()而不是->get()返回查询。

修补程序会议

这个查询有两个棘手的部分:子查询过滤和列比较。

第一个目前并没有真正记录,但是where如果您像这样使用它,该方法涵盖了该用例->where(column, Closure)

对于第二部分,您需要使用这样的->whereColumn方法->where(column1, column2)

// Using plain Query Builder
$data = DB::table('sub_task_information', 'st')
    ->where('created_at', function ($query) {
        return $query->selectRaw('max(created_at)')
                     ->from('sub_task_information', 'st2')
                     ->whereColumn('st2.sub_task_id', 'st.sub_task_id')
                     ->whereColumn('st2.user_id', 'st.user_id');
    })
    ->get();

这只是使用查询生成器。如果你想使用 Eloquent,你需要一个映射到sub_task_informations表的模型。

例如App\Models\SubTaskInformation,如果您有一个模型,您仍然可以执行相同的查询。

而不是仅仅替换DB::table('sub_task_information', 'st')...SubTaskInformation::from('sub_task_information', 'st')

通常您不需要该from方法,但在此查询中,您希望在外部选择中为表添加别名。

// Using an Eloquent model while aliasing the table.
$data = SubTaskInformation::from('sub_task_information', 'st')
    ->where('created_at', function ($query) {
        return $query->selectRaw('max(created_at)')
                     ->from('sub_task_information', 'st2')
                     ->whereColumn('st2.sub_task_id', 'st.sub_task_id')
                     ->whereColumn('st2.user_id', 'st.user_id');
    })
    ->get();
于 2020-12-10T23:30:34.247 回答