您可以使用 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();