2017-06-13 10 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

はい、できますが、実際にはEloquentを使用していません。これはクエリビルダーを使用しているだけです。 – apokryfos

答えて

1

Laravel \ 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); 

$ユーザー雄弁なし

+0

ありがとう。これはうまくいく。私はこの方法がLaravelの公式文書で文書化されたことを望みます。 – omrakhur

0

Eloquentはこのような具体的な方法を提供していません。私はアプリの\モデルを使用しますが、モデルクラスを作るhydrateRaw

ファーストを提供しませんあなたはDB::raw("...")を使用する必要があります(それは私が推測するソリューションではありません)、またはDB::select("SELECT ...");

1

クエリビルダでHydratedUserモデルのコレクションを保持する変数

サブクエリを作成し、DB::tableDB::rawおよびselectRaw()メソッドで使用します。

$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") 
関連する問題