Як виконувати необроблені запити за допомогою Laravel 5.1?


77

Отже, у мене є цей крихітний запит для запуску в моїй БД, і він чудово працює в MySQL Workbench. В основному, SELECT із LEFT JOIN і UNION з LEFT JOIN знову.

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

Спробував перекласти його на 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 у рядку 1249 Builder.php: Невизначена властивість: Illuminate \ Database \ Eloquent \ Builder :: $ bindings

Як я міг виконати повністю необроблений запит у Laravel або написати запит правильно в Laravel?

Відповіді:


157

Я знайшов рішення в цій темі і кодую це:

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

5
Вам навіть не потрібно вкладати виклик DB :: Raw. Ви можете просто викликати DB :: select ("... ваш рядок запиту ...");
Jimmy Zoto

4
У мене є запитання, якщо можу. Чи достатньо використання необроблених запитів sql за допомогою конструктора запитів (з або без DB :: raw) у Laravel 5 (точніше 5.3), щоб запобігти введенню sql? Я знайшов статтю про це, але це для Laravel 4. Я не можу знайти одного переконливого підтвердження.
Роберт

2
сам по собі DB :: select не захищає від введення SQL. Однак, переконавшись, що всі введені користувачем дані були запущені через $ safe_string = DB :: connection () -> getPdo () -> quote ($ string), ви можете захистити свій код.
ftrotter

6
Ви можете зв'язати параметри для вихідних запитів , щоб запобігти ін'єкції SQL ... laravel.com/docs/5.5/database#running-queries
Jabari

Це уповільнить ваш запит, це погана ідея.
Grald

2
    DB::statement("your query")

Я використовував його для додавання індексу до стовпця при міграції


-3

Ви також можете запустити необроблений запит.

DB::table('setting_colleges')->first();

це не метод Raw-запиту в Laravel, він просто отримує перший рядок цієї таблиці
Root
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.