2015-10-10 6 views
23

私はこの小さなクエリを自分のDB上で実行するようにしており、MySQL Workbenchでは正常に動作します。 基本的には、LEFT JOINのSELECTとLEFT JOINのUNIONを再度実行します。Laravel 5.1で生のクエリを実行する方法は?

SELECT 
    cards.id_card, 
    cards.hash_card, 
    cards.`table`, 
    users.name, 
    0 as total, 
    cards.card_status, 
    cards.created_at 
FROM cards 
LEFT JOIN users 
ON users.id_user = cards.id_user 
WHERE hash_card NOT IN (SELECT orders.hash_card FROM orders) 
UNION 
SELECT 
    cards.id_card, 
    orders.hash_card, 
    cards.`table`, 
    users.name, 
    sum(orders.quantity*orders.product_price) as total, 
    cards.card_status, 
    max(orders.created_at) 
FROM menu.orders 
LEFT JOIN cards 
ON cards.hash_card = orders.hash_card 
LEFT JOIN users 
ON users.id_user = cards.id_user 
GROUP BY hash_card 
ORDER BY id_card ASC 

InはLaravelに翻訳しようとしましたが、成功しませんでした。未定義のプロパティ: を照らし\データベース\雄弁\ビルダー:: $バインディング

どのようにできた

$cards = Card::selectRaw('cards.id_card, cards.hash_card ,cards.table, users.name, 0 as total, cards.card_status, cards.created_at as last_update') 
       ->leftJoin('users','users.id_user','=','cards.id_user') 
       ->whereNotIn('hash_card', Order::select('orders.hash_card')->get()) 
       ->union(
         Order::selectRaw('cards.id_card, orders.hash_card, cards.table, users.name, sum(orders.quantity*orders.product_price) as total, cards.card_status, max(orders.created_at) as last_update') 
         ->leftJoin('cards','cards.hash_card','=','orders.hash_card') 
         ->leftJoin('users','users.id_user','=','cards.id_user') 
       ) 
       ->groupBy('hash_card') 
       ->orderBy('cards.id_card','asc') 
       ->get(); 

私はエラーに

ErrorException Builder.phpでライン1249を取得しています私はLaravelで完全に生のクエリを実行するか、Laravelで正しい方法でクエリを記述しますか?

答えて

53

私はthis topicで解決策を見つけたと私は、このコード:

$cards = DB::select("SELECT 
           cards.id_card, 
           cards.hash_card, 
           cards.`table`, 
           users.name, 
           0 as total, 
           cards.card_status, 
           cards.created_at as last_update 
          FROM cards 
          LEFT JOIN users 
          ON users.id_user = cards.id_user 
          WHERE hash_card NOT IN (SELECT orders.hash_card FROM orders) 
          UNION 
          SELECT 
           cards.id_card, 
           orders.hash_card, 
           cards.`table`, 
           users.name, 
           sum(orders.quantity*orders.product_price) as total, 
           cards.card_status, 
           max(orders.created_at) last_update 
          FROM menu.orders 
          LEFT JOIN cards 
          ON cards.hash_card = orders.hash_card 
          LEFT JOIN users 
          ON users.id_user = cards.id_user 
          GROUP BY hash_card 
          ORDER BY id_card ASC"); 
+1

をあなたが実際にも、巣にDB ::生のコールを必要としません。あなたは単にDB :: select( "...あなたのクエリ文字列...")を呼び出すことができます。 –

+0

あなたは正しいです!私は巣DBを取り除きました:生とそれは魅力のように機能します! ;) –

+2

私はもし可能ならば質問があります。 Laravel 5(正確には5.3)でクエリービルダー(DBなし)のRaw SQLクエリを使用していますか?SQLインジェクションを防止するには十分ですか?私はそれについていくつかの記事を見つけましたが、それはLaravel 4のためです。私は1つの確かな確認を見つけることができません。 – Robert