Wie führe ich Rohabfragen mit Laravel 5.1 aus?

75

Ich muss diese winzige Abfrage auf meiner Datenbank ausführen und sie funktioniert in MySQL Workbench einwandfrei. Grundsätzlich ein SELECT mit LEFT JOIN und UNION mit LEFT JOIN wieder.

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

Ich habe versucht, es ohne Erfolg nach Laravel zu übersetzen.

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

Ich bekomme den Fehler

ErrorException in Builder.php Zeile 1249: Undefinierte Eigenschaft: Illuminate \ Database \ Eloquent \ Builder :: $ bindings

Wie kann ich eine vollständig rohe Abfrage in Laravel ausführen oder die Abfrage in Laravel richtig schreiben?

Sandro Wiggers
quelle

Antworten:

154

Ich habe die Lösung in diesem Thema gefunden und codiere diese:

$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");
Sandro Wiggers
quelle
5
Sie müssen den DB :: Raw-Aufruf nicht einmal verschachteln. Sie können einfach DB :: select aufrufen ("... Ihre Abfragezeichenfolge ...");
Jimmy Zoto
4
Ich habe eine Frage, wenn ich darf. Reicht die Verwendung von SQL-Rohabfragen über den Abfrage-Generator (mit oder ohne DB :: raw) in Laravel 5 (um genau zu sein 5.3) aus, um eine SQL-Injektion zu verhindern? Ich habe einen Artikel darüber gefunden, aber er ist für Laravel 4. Ich kann keine überzeugende Bestätigung finden.
Robert
2
DB :: select schützt nicht vor SQL-Injection. Indem Sie jedoch sicherstellen, dass alle vom Benutzer bereitgestellten Eingaben über $ safe_string = DB :: connection () -> getPdo () -> quote ($ string) ausgeführt wurden, können Sie Ihren Code schützen.
Ftrotter
6
Sie können Parameter an Rohabfragen
Jabari
Es wird Ihre Anfrage verlangsamen, es ist eine schlechte Idee.
Grald
0
    DB::statement("your query")

Ich habe es verwendet, um der Spalte bei der Migration einen Index hinzuzufügen

ДароваДарова
quelle
-2

Auf diese Weise können Sie auch eine Rohabfrage ausführen.

DB::table('setting_colleges')->first();
Pankaj Kumar
quelle