Laravel 从 mysql 迁移到 postgresql 时 Elequent ORM 不工作
Laravel elequent ORM not working when migrate from mysql to postgresql
ORM 的基本特性通常表示数据库可以很容易地从一个数据库迁移到另一个数据库。在这里,我最初为我的项目使用了 MySQL 数据库,并计划将其迁移到 PostgreSQL。迁移时,它几乎可以处理所有使用 select * 来自 table、插入更新等的简单查询。
但是当我通过 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结构编写了查询。请帮我解决这个问题。
编辑 1
n 简而言之,我想告诉我如何编写此查询
DB::table('sales_target')
->select(db::raw("DATEDIFF(end_date,start_date) AS DaysInQuarter"))
->first();
它应该在 mysql 和使用 ORM 的 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)
如果您正在使用 db::raw()
,那么 ORM 无法帮助您从数据库引擎中抽象出来。您应该查看 Carbon integration in Laravel and methods of the Query Builder like whereBetween()
以重写您的查询。
当您使用 "db::raw(" 时,这就不再是 ORM。
您只需将该字符串原封不动地直接发送到数据库服务器即可。
检查 Postgresql 是否具有与 DateDIFF 函数相同的语法
首先,你在这里没有使用ORM。您使用的是查询生成器,而不是 Eloquent.
第二件事是 Laravel 不会为您完成这项工作 - 如果您使用原始表达式,您应该根据您使用的数据库引擎来使用它们。
此外,您应该关心 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
是您完全控制的变量,但最好使用准备好的语句,以防您稍后决定使用用户输入数据。
我可以这样写来管理查询
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();
我认为在 eloquent 中我们必须手动将函数 DATEDIFF 更改为 DATE_PART。但是在像 hibernate 这样的 ORM 中,我认为他们自己在不同的 SQL 查询中管理这个函数变化。
ORM 的基本特性通常表示数据库可以很容易地从一个数据库迁移到另一个数据库。在这里,我最初为我的项目使用了 MySQL 数据库,并计划将其迁移到 PostgreSQL。迁移时,它几乎可以处理所有使用 select * 来自 table、插入更新等的简单查询。
但是当我通过 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结构编写了查询。请帮我解决这个问题。
编辑 1
n 简而言之,我想告诉我如何编写此查询
DB::table('sales_target')
->select(db::raw("DATEDIFF(end_date,start_date) AS DaysInQuarter"))
->first();
它应该在 mysql 和使用 ORM 的 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)
如果您正在使用 db::raw()
,那么 ORM 无法帮助您从数据库引擎中抽象出来。您应该查看 Carbon integration in Laravel and methods of the Query Builder like whereBetween()
以重写您的查询。
当您使用 "db::raw(" 时,这就不再是 ORM。
您只需将该字符串原封不动地直接发送到数据库服务器即可。
检查 Postgresql 是否具有与 DateDIFF 函数相同的语法
首先,你在这里没有使用ORM。您使用的是查询生成器,而不是 Eloquent.
第二件事是 Laravel 不会为您完成这项工作 - 如果您使用原始表达式,您应该根据您使用的数据库引擎来使用它们。
此外,您应该关心 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
是您完全控制的变量,但最好使用准备好的语句,以防您稍后决定使用用户输入数据。
我可以这样写来管理查询
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();
我认为在 eloquent 中我们必须手动将函数 DATEDIFF 更改为 DATE_PART。但是在像 hibernate 这样的 ORM 中,我认为他们自己在不同的 SQL 查询中管理这个函数变化。