2017-12-18 43 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