Laravel 对 eloquent 模型的原始查询
Posted
技术标签:
【中文标题】Laravel 对 eloquent 模型的原始查询【英文标题】:Laravel raw query to eloquent model 【发布时间】:2021-03-22 06:01:15 【问题描述】: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?
【问题讨论】:
你的问题缺乏研究工作,展示你到目前为止所做的工作,阅读how to ask on *** 为什么需要子查询?似乎您可以使用查询生成器和orderByDesc('created_at')->groupBy(user_id)->limit(1)
我不确定,但试试这个:SubTaskInformation::join('sub_task_informations AS st2', function($query) $query->on('st2.sub_task_id', '=', 'sub_task_informations.sub_task_id'); $query->where('sub_task_informations.created_at', '=', \DB::raw('MAX(st2.created_at'))); )->groupBy('sub_task_informations.id');
【参考方案1】:
您可以使用tinker
shell 轻松测试查询,甚至无需访问您的数据库。只需使用->toSql()
而不是->get()
即可返回查询。
这个查询有两个棘手的部分:子查询过滤和列比较。
目前第一个并没有真正记录,但如果您像这样使用where
方法,则它涵盖了该用例:->where(column, Closure)
。
对于第二部分,你需要像->where(column1, column2)
这样使用->whereColumn
方法。
// 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
,您仍然可以执行相同的查询。
而不仅仅是用SubTaskInformation::from('sub_task_information', 'st')
替换DB::table('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();
【讨论】:
以上是关于Laravel 对 eloquent 模型的原始查询的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中通过多对多关系模型对 eloquent 模型进行排序