【问题标题】:Convert mySQL queries to Laravel将 mySQL 查询转换为 Laravel
【发布时间】:2020-01-31 13:13:51
【问题描述】:

我是 laravel 新手,是数据库查询所需的新解决方案。 我有以下原始查询:

SELECT SUM(un.uni_duration) AS course_duration FROM xxcourse_components xx
INNER JOIN courses co ON co.cou_id = xx.cco_version
INNER JOIN modules mo ON mo.mod_id = xx.cco_component
INNER JOIN xxmodule_units xu ON xu.modu_module = mo.mod_id
INNER JOIN units un ON un.uni_id = xu.modu_unit
WHERE co.cou_id = "6"
AND un.deleted_at IS NULL;

我尝试转换为 laravel 作为查询生成器:

return DB::table('xxcourse_components as xx')
            ->select('SUM(un.uni_duration) as course_duration')
            ->join('courses as co', 'co.cou_id', '=', 'xx.cco_version')
            ->join('modules as mo', 'mo.mod_id', '=', 'xx.cco_component')
            ->join('xxmodule_units as xu', 'xu.modu_module', '=', 'mo.mod_id')
            ->join('units as un', 'un.uni_id', '=', 'xu.modu_unit')
            ->where('co.cou_id ', '=', $cou_id)
            ->whereNull('un.deleted_at')
            ->get();

但是结果让我出错了:

SQLSTATE[42S22]: 未找到列: 1054 未知列 'SUM(un.uni_duration)' in 'field list' (SQL: select SUM(un.uni_duration) as course_duration from xxcourse_components as @987654327 @inner join courses as co on co.cou_id = xx.cco_versioninner join modules as mo on mo.xx.cco_component.@98 @ 内连接 xxmodule_units as xu on xu.modu_module = mo.mod_id 内连接 units as un on un.@9876545349@.@986545349@.@98 @ 其中co.cou_id = 6 和un.deleted_at 为空)

有解决错误的线索吗?

【问题讨论】:

    标签: mysql laravel-5


    【解决方案1】:

    使用selectRaw:

    return DB::table('xxcourse_components as xx')
        ->selectRaw('SUM(un.uni_duration) AS course_duration')
        ->join('courses as co', 'co.cou_id', '=', 'xx.cco_version')
        ->join('modules as mo', 'mo.mod_id', '=', 'xx.cco_component')
        ->join('xxmodule_units as xu', 'xu.modu_module', '=', 'mo.mod_id')
        ->join('units as un', 'un.uni_id', '=', 'xu.modu_unit')
        ->whereRaw('co.cou_id = ?', [$cou_id])
        ->whereNull('un.deleted_at')
        ->get();
    

    注意:我还重构了您的 WHERE 子句以使用带有语句参数的 whereRaw。理想情况下,您应该使用准备好的语句来避免 SQL 注入。不过,如果您可以验证 $cou_id 仅包含数字,那么注入风险应该是最小的。

    【讨论】:

    • 我相信 laravel 中正常的 'where()' 也会生成一个prepared statement。无需手动将其拉开。
    • @RobBiermann 你能提供一个参考或例子吗? (我自己也不知道答案)。
    • Date::where('date', '2019-01-01')->get() 产生select * from dates where date = ?"2019-01-01" 的绑定。请注意,在这种情况下 Date 是一个模型
    • 查询前运行DB::enableQueryLog(),查询后运行dump(DB::getQueryLog());可以看到执行语句
    • @Time Biegeleisen,谢谢伙计,但我能知道为什么 select() 会导致错误而不是 selectRaw() 吗?
    【解决方案2】:

    在您的选择上使用 \DB::raw,如下所示:

    ...
    ->select(\DB::raw('SUM(un.uni_duration) as course_duration'))
    ...
    

    你可以在这里找到文档Laravel Raw Expressions

    【讨论】:

    • selectRaw() 是一个更短/更简洁的替代方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多