当从mysql迁移到postgresql时,Laravel elequent ORM不起作用

ORM的基本功能通常表示,由于数据库迁移很容易从一个数据库迁移到另一个数据库。在这里,我最初为我的项目使用了MySQL数据库,并计划将其迁移到PostgreSQL。在迁移时,它几乎可以处理select * from table,插入更新等所有简单查询。当从mysql迁移到postgresql时,Laravel elequent ORM不起作用

但是,当我通过My​​SQL中的某个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结构与否。请帮我解决这个问题。

编辑1

N短期我想任何人告诉我,我怎么可以这样写查询

DB::table('sales_target') 

->select(db::raw("DATEDIFF(end_date,start_date) AS DaysInQuarter"))

->first();

应在MySQL和postgresl使用ORM工作。

在Mysql中它正常工作,但在postgresql中不是这样。

我如果使用db::raw()那么ORM不能帮助你从数据库引擎抽象得到一个错误,这样

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) 

回答:

我可以通过写这样的

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数管理查询。但在像休眠这样的ORM中,我认为他们自己在不同的SQL查询中管理这个函数更改。

回答:

。您应该看看Laravel中的Carbon集成和methods of the Query Builder like whereBetween()以重写您的查询。

回答:

当您使用“DB ::原始(”那么这是没有更多的ORM。

你刚才发送的字符串直接到数据库服务器,正是因为它是。

检查PostgreSQL的具有相同语法DateDiff函数

回答:

首先,你不使用ORM您可以使用查询生成器,而不是雄辩

第二件事情是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和​​是变量,你完全控制,但如果您稍后决定使用用户输入数据,则最好使用预先准备好的语句。

以上是 当从mysql迁移到postgresql时,Laravel elequent ORM不起作用 的全部内容, 来源链接: utcz.com/qa/263861.html

回到顶部