![](/img/trans.png)
[英]Laravel9 - DB Query with one parent and 2 children not summing properly in 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.