2017-12-18 360 views
0

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) 

回答

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

0

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

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

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

0

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

+0

查询生成器是否也基于雄辩?他们的功能是不是可以互换的(我可以在一个雄辩的querry中使用每个DB功能)?我同意Db :: raw不是以任何方式ORM 请考虑到我只是在学习模式时,当我问这个:) – Radu

+0

不,Eloquent使用查询生成器,但查询生成器不使用Eloquent。在上面你使用查询生成器,因为你开始于'DB :: table('sales_target')' - 如果你从你的模型'SalesTarget'开始,那么你将使用Eloquent –

+0

谢谢先生! – Radu