2017-08-04 11 views
1

私は、トランザクションテーブルからorder_id、created_at date、transaction_amountを取得しています。私はorder_id、created_at date、およびtransaction_amountでいくつかのレコードを取得しました。今私は、transaction_amount列の合計が欲しい。私は、うまく動作しているdbの次のクエリを試してみましたが、laravelに同じクエリを書くことができません。カスタムクエリをlaravel 5に変換する方法は?

select sum(transaction_amount) from (
select order_id, max(created_at), transaction_amount 
from transactions 
WHERE user_id =100 AND accounting_type = "Debit" 
group by order_id 
limit 500) as transactions 

私はこの方法を試してみましたが、それでも

$sql = "select sum(transaction_amount) from 
       ('select order_id, max(created_at), transaction_amount 
       from transactions 
       WHERE user_id =100 
       group by order_id 
       limit 500') as transactions"; 
     $result = \DB::select(\DB::raw($sql)); 
+0

あなたの 'user_id'カラムはどこですか?トランザクションテーブルの中であなたが選択していない場合、どのようにそれをどこで使うことができますか? –

+0

'DB:raw()'はうまくいくはずです。何がうまくいかない?あなたはエラーが発生しますか? – lesssugar

答えて

3

まず、あなたのクエリを打破してみましょう: メインクエリ

SELECT 
SUM(transaction_amount) 
FROM 
    (...) AS transactions 

これは要約に使用されたばかりです。そして、あなたのサブクエリ:サブクエリの場合

 SELECT 
      order_id, 
      MAX(created_at), 
      transaction_amount 
     FROM 
      transactions 
     WHERE 
      user_id = 100 
      AND accounting_type = "Debit" 
     GROUP BY 
      order_id LIMIT 500 

は、Laravelのクエリビルダは、次のようになります。あなたがより多くのためにそれ

$result->sum('transaction_amount'); 

を呼び出すことができるように

use DB; 

$result = DB::table('table') 
->select(DB::raw("order_id, MAX(created_at), transaction_amount")) 
->where("user_id", "=", 100) 
->where("accounting_type", "=", "Debit") 
->groupBy("order_id") 
->limit(500) 
->get(); // this will return Laravel Collection (Illuminate\Support\Collection) 

Laravelコレクションsum方法があります詳細についてはthisthis Laravelのドキュメントをお読みください。

+0

'(user_id"、 "="、100) 'が動作する' - >行の 'user_id'を疑問に思っていますか?そこから来るだろうか? –

+0

私は 'DB :: table()'はむしろ 'DB :: table( 'transactions')'にする必要があると思います。 – iArcadia

+0

SQLの 'WHERE'節にある列は' SELECT'節に存在しなければならないわけではありません。しかし、 'GROUP BY'を使っている間はどういう意味でしょうか。 'GROUP BY'クラスで使われる列は、' SELECT'節に存在するはずです。 CMIIW –

0

を働いていない私はあなたの$sql変数があなたのFROMからのみ、サブクエリを含有しなければならないと思います。

Laravel QueryBuilderのtable()方法はSQLでFROM文の「同等」で、それはあなたがあなたのサブクエリを置くことをここにあります。

$sql = 'select order_id, max(created_at), transaction_amount 
      from transactions 
      WHERE user_id =100 
      group by order_id 
      limit 500'; 

$result = \DB::table(\DB::raw($sql))->sum('transaction_amount'); 

を試してみて、あなたが使用しようとしたselect()方法とparrallelたい場合は代わりに、:

$result = \DB::table(\DB::raw($sql))->select(\DB::raw('sum(transaction_amount) as sum'))->get(); 
関連する問題