【问题标题】:How to execute raw queries with Laravel 5.1?如何使用 Laravel 5.1 执行原始查询?
【发布时间】:2016-01-08 01:35:14
【问题描述】:

所以我有这个小查询要在我的数据库上运行,它在 MySQL Workbench 中运行良好。 基本上,一个带有 LEFT JOIN 的 SELECT 和一个带有 LEFT JOIN 的 UNION。

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

我收到了错误

Builder.php 第 1249 行中的 ErrorException:未定义的属性: Illuminate\Database\Eloquent\Builder::$bindings

我如何在 Laravel 中执行一个完全原始的查询或在 Laravel 中以正确的方式编写查询?

【问题讨论】:

    标签: php mysql sql database laravel-5.1


    【解决方案1】:

    我在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");
    

    【讨论】:

    • 实际上你甚至不需要嵌套 DB::Raw 调用。你可以直接调用 DB::select("... your query string...");
    • 如果可以,我有一个问题。在 Laravel 5(确切地说是 5.3)中通过查询生成器(有或没有 DB::raw)使用原始 sql 查询是否足以防止 sql 注入?我找到了一些关于它的文章,但它是针对 Laravel 4 的。我找不到一个令人信服的确认。
    • DB::select 本身并不能防止 SQL 注入。但是,通过确保所有用户提供的输入都通过 $safe_string = DB::connection()->getPdo()->quote($string) 运行,您可以保护您的代码。
    • 您可以将参数绑定到原始查询以防止 SQL 注入...laravel.com/docs/5.5/database#running-queries
    • 这会减慢您的查询速度,这是个坏主意。
    【解决方案2】:
        DB::statement("your query")
    

    我用它为迁移中的列添加索引

    【讨论】:

    • 不适合我。谢谢。
    【解决方案3】:

    来自 Laravel 文档的示例:

    $users = DB::table('users')
        ->selectRaw('count(*) as user_count, status')
        ->where('status', '<>', 1)
        ->groupBy('status')
        ->get();
    

    另一个例子:

    $products = DB::table('products')
        ->leftjoin('category','category.product_id','=','products.id')
        ->selectRaw('COUNT(*) as nbr', 'products.*')
        ->groupBy('products.id')
        ->get();
    

    另一个例子——我们甚至可以在同一个语句中执行 avg() 和 count()。

    $salaries = DB::table('salaries')
        ->selectRaw('companies.name as company_name, avg(salary) as avg_salary, count(*) as people_count')
        ->join('companies', 'salaries.company_id', '=', 'companies.id')
        ->groupBy('companies.id')
        ->orderByDesc('avg_salary')
        ->get();
    

    学分: https://blog.quickadminpanel.com/5-ways-to-use-raw-database-queries-in-laravel/

    【讨论】:

      【解决方案4】:

      您也可以像这样运行原始查询。

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

      【讨论】:

      • 这不是 Laravel 中的 Raw 查询方法,它只是获取该表的第一行
      • 这是错误的查询。 :(
      猜你喜欢
      • 2016-05-10
      • 1970-01-01
      • 2019-04-27
      • 2016-04-30
      • 1970-01-01
      • 2017-04-08
      • 2018-10-30
      • 2021-06-24
      相关资源
      最近更新 更多