2017-06-13 42 views
0

如何將以下內容轉換爲Eloquent語法?我知道那裏有一個派生表,因此不確定Laravel中的正確語法是什麼?Laravel - 如何將包含串聯查詢的派生錶轉換爲Eloquent語法?

SELECT firstname 
, CONCAT_WS 
(', ' 
, CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END 
, CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END 
, CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END 
) lengthOfService 
FROM 
(SELECT firstname 
, FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years 
, FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months 
, CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) 
- FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days 
FROM users 
) x 
+1

Eloquent是一個ORM,它將物理關係錶轉換爲對象。我不認爲它適用於派生表。但是,您可以在用戶表中添加一個範圍,以過濾到該派生表。 – apokryfos

+0

@apokryfos理論上可以將它包裝到'DB :: raw()'中嗎? – omrakhur

+1

是的,你可以,但這不是真正使用雄辯,這只是使用查詢生成器。 – apokryfos

回答

1

Laravel確實提供hydrateRaw

首先製作一個模型類,我可以使用App \型號\ MyHydratedUser

$query = "SELECT firstname, CONCAT_WS (', ' 
, CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END 
, CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END 
, CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END 
) lengthOfService 
FROM 
(SELECT firstname 
, FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years 
, FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - 
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months 
, CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 - 
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) 
- FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - 
FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days 
FROM users 
) x"; 

$users = App\Models\HydratedUser::hydrateRaw($query); 

在$用戶變量將舉行HydratedUser模型的收藏

+0

謝謝。這很好。我希望這種方法記錄在官方的Laravel文檔中。 – omrakhur

0

雄辯不提供這樣的具體方法。您將需要使用DB::raw("...")(但是這不是一個解決方案,我猜),或DB::select("SELECT ...");

1

沒有口才與查詢生成器

創建子查詢並使用DB::tableDB::rawselectRaw()方法。

$subQuery = DB::table('users') 
    ->selectRaw('firstname, 
     FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425) years, 
     FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - 
     FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) months, 
     CEILING((((DATEDIFF(CURDATE(),startdate)/365.2425 - 
     FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12) - 
     FLOOR((DATEDIFF(CURDATE(),startdate)/365.2425 - 
     FLOOR(DATEDIFF(CURDATE(),startdate)/365.2425))* 12))* 30) days'); 

DB::table(DB::raw('('.$subQuery->toSql().') as tableName') 
    ->selectRaw("firstname, CONCAT_WS(', ', 
     CASE WHEN years = 0 THEN NULL ELSE CONCAT(years,' years') END, 
     CASE WHEN months = 0 THEN NULL ELSE CONCAT(months, ' months') END, 
     CASE WHEN days = 0 THEN NULL ELSE CONCAT(days, ' days') END) lengthOfService") 
相關問題