繁体   English   中英

Laravel SelectRaw 查询未执行

[英]Laravel SelectRaw Query Not Executing

我遇到了一个问题,下面列出的查询不会在我们的实时服务器上执行(在我写这篇文章时,它应该返回一个约 2940 条记录的数据集,通过 MySQL 运行时查询执行良好)。

它不会引发任何错误,查询根本不会执行,并且代码在查询之后永远不会到达任何内容。 这只会发生在我们的实时/生产服务器上,不会发生在我们的开发和本地环境中(也许是因为数据集要小得多?)

此 function 的目的是获取此数据并将其发送到 CSV 文件中,然后将其交回给用户,因此设置了 header。

    header("Content-type: application/vnd.ms-word");
    
    $filename = "ORDERS-" . date("m-d-Y") . ".csv";    

    $query_result = Order::selectRaw("orders.id AS \"Order_ID\", orders.distributor_id AS \"Distributor_ID\", orders.gross_total AS \"Gross_Total\", IF( orders.multiple_card_id != 0, \"Yes\", \"No\" ) AS \"Group_Order\", IF( orders.payment_plan_id != 0, \"Yes\", \"No\" ) AS \"Recurring_Order\", orders.name AS \"Order_Name\", order_statuses.name AS \"Order_Status\", order_statuses.id AS \"Order_Status_ID\", DATE(orders.created_at) AS \"Order_Date\", order_shipment_methods.name AS \"Shipping Method\", addresses.line1 AS \"Address_Line_1\", addresses.line2 AS \"Address_Line_2\", addresses.line3 AS \"Address_Line_3\", addresses.city AS \"City\", addresses.postal_code AS \"Address_Postal_Code\", states.name AS \"Address_State\", countries.name AS \"Address_Country\"")
    ->leftjoin("addresses", "addresses.id", "=", "orders.address_id")
    ->leftjoin("states", "addresses.state_id", "=", "states.id")
    ->leftjoin("countries", "addresses.country_id", "=", "countries.id")
    ->leftjoin("order_statuses", "orders.order_status_id", "=", "order_statuses.id")
    ->leftjoin("order_shipments", "order_shipments.order_id", "=", "orders.id")
    ->leftjoin("order_shipment_methods", "order_shipments.shipping_method_id", "=", "order_shipment_methods.id")
    ->whereRaw("YEAR(orders.created_at) = \"" . date("Y") . "\"")->get();

关于为什么这可能不起作用的任何指示? 我迷路了,因为错误日志中没有任何内容或类似的东西。

该问题最终是由于 memory 溢出问题造成的。

我不想仅仅为这项工作增加 memory,所以我能够通过使查询一次获取 1000 行而不是要求它一次获取所有内容来解决这个问题。 由于多个数据库调用,它的速度较慢,但它会完成工作。

    $i = 0;
    $size = 1000;

    do
    {
        $query_result = Order::selectRaw("orders.id AS \"Order_ID\", orders.distributor_id AS \"Distributor_ID\", orders.gross_total AS \"Gross_Total\", IF( orders.multiple_card_id != 0, \"Yes\", \"No\" ) AS \"Group_Order\", IF( orders.payment_plan_id != 0, \"Yes\", \"No\" ) AS \"Recurring_Order\", orders.name AS \"Order_Name\", order_statuses.name AS \"Order_Status\", order_statuses.id AS \"Order_Status_ID\", DATE(orders.created_at) AS \"Order_Date\", order_shipment_methods.name AS \"Shipping Method\", addresses.line1 AS \"Address_Line_1\", addresses.line2 AS \"Address_Line_2\", addresses.line3 AS \"Address_Line_3\", addresses.city AS \"City\", addresses.postal_code AS \"Address_Postal_Code\", states.name AS \"Address_State\", countries.name AS \"Address_Country\"")
        ->leftjoin("addresses", "addresses.id", "=", "orders.address_id")
        ->leftjoin("states", "addresses.state_id", "=", "states.id")
        ->leftjoin("countries", "addresses.country_id", "=", "countries.id")
        ->leftjoin("order_statuses", "orders.order_status_id", "=", "order_statuses.id")
        ->leftjoin("order_shipments", "order_shipments.order_id", "=", "orders.id")
        ->leftjoin("order_shipment_methods", "order_shipments.shipping_method_id", "=", "order_shipment_methods.id")
        ->whereRaw("YEAR(orders.created_at) = ?", [ date("Y") ])->offset( $i * $size )->limit( $size )->get();
     

        //now for each query result, we'll pop the data into the csv
        foreach( $query_result as $q )
        {
            $data_set = [];
            foreach( $q as $key => $value ) { array_push( $data_set, $value ); }
            fputcsv( $dl, $data_set );
        }
        

        $i++;
    } while ( count($query_result) == $size );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM