2015-10-10 8 views
23

तो मेरे पास मेरे डीबी पर चलाने के लिए यह छोटी सी क्वेरी है और यह MySQL वर्कबेंच में ठीक काम करता है। मूल रूप से, बाएं जॉइन के साथ एक चयन और बाएं जॉइन के साथ यूनियन।लार्वेल 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 

इसे बिना किसी सफलता के लैरवेल में अनुवाद करने की कोशिश की गई।

$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(); 

मैं त्रुटि मिल रही है

Builder.php में ErrorException लाइन 1249: अपरिभाषित संपत्ति: रोशन \ डाटाबेस \ सुवक्ता \ बिल्डर :: $ बाइंडिंग

कैसे कर सकते थे मैं लार्वेल में पूरी तरह कच्ची क्वेरी निष्पादित करता हूं या लारवेल में सही तरीके से क्वेरी लिखता हूं?

उत्तर

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

आप वास्तव में भी डीबी :: कच्चे कॉल घोंसला की जरूरत नहीं है। आप बस डीबी :: चयन ("... अपनी क्वेरी स्ट्रिंग ...") को कॉल कर सकते हैं; –

+0

आप सही हैं! मैं घोंसला डीबी हटा देता हूं: कच्चा और यह एक आकर्षण की तरह काम करता है! ;) –

+2

मेरे पास एक प्रश्न है यदि मैं कर सकता हूं। लार्वेल 5 (5.3 सटीक होने के लिए) में क्वेरी बिल्डर (डीबी :: कच्चे के साथ) के माध्यम से कच्चे एसक्यूएल प्रश्नों का उपयोग एसक्यूएल इंजेक्शन को रोकने के लिए पर्याप्त है? मुझे इसके बारे में कुछ लेख मिला है लेकिन यह लैरावेल 4 के लिए है। मुझे एक दृढ़ पुष्टि नहीं मिल रही है। – Robert

संबंधित मुद्दे