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 模型进行排序

laravel sql子查询

Eloquent:我需要做这个原始查询吗?

Laravel Eloquent - 如何将范围查询内的计算值作为模型列或集合属性返回

Laravel五大功能之Eloquent关系模式

Laravel五大功能之Eloquent关系模式