首页 文章

从mysql迁移到postgresql时,Laravel elequent ORM无法正常工作

提问于
浏览
0

ORM的基本功能通常表示,从一个数据库到另一个数据库很容易实现数据库迁移 . 在这里,我最初使用MySQL数据库作为我的项目,并计划将其迁移到PostgreSQL . 迁移时,它几乎可以使用select * from table,insert update等进行所有简单查询 .

但是当我在MySQL中遇到一些 datediff 函数时,ORM无法在PostgreSQL中创建相应的查询 .

这是我的查询

$result = DB::table('sales_target')
                ->select(db::raw('DATEDIFF(end_date,start_date) as DaysInQuarter'))
                ->whereraw("sales_target.target_quarter=$currentQuarter AND sales_target.target_year=$currentYear and status=1")
                ->first();

我想知道我是否以完全ORM结构编写了查询 . 请帮我解决这个问题 .

Edit 1

我希望任何人都告诉我如何编写此查询

DB::table('sales_target')
                ->select(db::raw("DATEDIFF(end_date,start_date) AS DaysInQuarter"))
                ->first();

哪个应该在使用ORM的mysql和postgresl中工作 .

在Mysql中它正常工作但在postgresql中它不是 .

我收到这样的错误

No function matches the given name and argument types. You might need to add explicit type casts. (SQL: select DATEDIFF(end_date,start_date) AS DaysInQuarter from "sales_target" limit 1)

4 回答

  • 0

    首先,您不要在这里使用ORM . 您正在使用查询构建器而不是Eloquent .

    第二件事是Laravel不会为你做这项工作 - 如果你使用原始表达式,你应该根据你使用的db引擎使用它们 .

    另外,你应该关心SQL注入,现在可以在你的查询中注入一些代码,你应该使用:

    $result = DB::table('sales_target')
                    ->select(db::raw('DATEDIFF(end_date,start_date) as DaysInQuarter'))
                    ->whereRaw("sales_target.target_quarter=? AND sales_target.target_year= ? and status=1", [$currentQuarter, $currentYear])
                    ->first();
    

    当然在上面的情况下, $currentQuarter$currentYear 可能是你完全控制的变量,但如果你决定以后使用用户输入数据,最好使用准备好的状态 .

  • 1

    如果您使用的是 db::raw() ,则ORM无法帮助您从数据库引擎中进行抽象 . 您应该看看Laravel中的Carbon集成和methods of the Query Builder like whereBetween()来重写您的查询 .

  • 0

    当你使用“db :: raw(”时,这不再是ORM .

    您只需将该字符串直接发送到数据库服务器即可 .

    检查Postgresql是否具有与DateDIFF函数相同的语法

  • 0

    我可以像这样编写来管理查询

    DB::table('sales_target')
                    ->select(db::raw(" DATE_PART('day', end_date - start_date) AS DaysInQuarter"))
                    ->whereRaw("sales_target.target_quarter=? AND sales_target.target_year= ? and status=1", [$currentQuarter, $currentYear])
                    ->first();
    

    我认为在雄辩中我们必须手动将功能DATEDIFF更改为DATE_PART . 但是在像hibernate这样的ORM中我认为他们自己管理这个函数会在不同的SQL查询中发生变化 .

相关问题