[英]Laravel: How Can I Convert This Sql Statement to Eloquent or Query Builder
[英]Laravel: How can I convert this query back to eloquent?
如何将这个查询转换回雄辩。 我这样做是为了进行测试,因为我无法在原始的laravel查询中获得结果,因此我尝试直接对数据库进行测试。 现在我的问题是我将查询包装在select和group中以获得所需的结果
SELECT t.restaurant_number, COUNT(t.lowDollarModified)
FROM (
SELECT
header.transaction_id,
header.restaurant_number,
(SUM(CASE
WHEN
(
header.net_amount <= 2.50 or
details.detail_type = 90
or details.modifier_flag > 0
)
AND tender.description = '01 CASH'
THEN
1
ELSE 0
END)) AS lowDollarModified
FROM
`db_prod`.`header`
INNER JOIN
`db_prod`.`details` ON `header`.`transaction_id` = `details`.`transaction_id`
INNER JOIN
`db_prod`.`tender` ON `header`.`transaction_id` = `tender`.`transaction_id`
WHERE
`business_date` BETWEEN '2018-03-01' AND '2018-03-04'
AND NOT EXISTS( SELECT
*
FROM
`db_prod`.`ticket_mapping`
WHERE
`header`.`transaction_id` = `ticket_mapping`.`transaction_id`
AND `isClosed` = 1)
AND `header`.`restaurant_number` = 1606
GROUP BY `header`.`restaurant_number`, transaction_id
Having lowDollarModified > 0
) as t
GROUP BY t.restaurant_number
这是我在laravel中的原始查询
$stores1 = Header::select([
DB::raw('header.transaction_id'),
DB::raw('header.restaurant_number'),
DB::raw('(SUM(CASE WHEN
(
header.net_amount <= '.$void.' or
details.detail_type = 90 or
details.modifier_flag > 0
) and
tender.description = "01 CASH"
THEN 1 ELSE 0 END
) ) as lowDollarModified
')
])
->join('details', 'header.transaction_id','details.transaction_id')
->join('tender','header.transaction_id','tender.transaction_id')
->whereBetween('business_date',[$date_from, $date_to])
->whereDoesntHave('ticketmapping', function($query){
$query->where('isClosed', 1);
})
->where('header.restaurant_number','1606')
->groupBy('header.restaurant_number', 'header.transaction_id')
->havingRaw('lowDollarModified > 0')
->get();
对于高级查询,但在该存储的proc中不需要任何循环,将是您的最后选择。 您可以创建一个VIEW TABLE
然后为此创建一个模型。 而不是在代码中执行'whereRaw'
。
DB::select(`t.restaurant_number`)
->addSelect(DB::raw(`COUNT(t.lowDollarModified)`))
->from(`SELECT header.transaction_id, header.restaurant_number, ( SUM( CASE WHEN ( header.net_amount <= 2.50 or details.detail_type = 90 or details.modifier_flag > 0 ) AND tender.description = 01 CASH THEN 1 ELSE 0 END ) ) AS lowDollarModified FROM db_prod.header INNER JOIN db_prod.details ON header.transaction_id = details.transaction_id INNER JOIN db_prod.tender ON header.transaction_id = tender.transaction_id WHERE business_date BETWEEN 2018-03-01 AND 2018-03-04 AND NOT EXISTS( SELECT * FROM db_prod.ticket_mapping WHERE header.transaction_id = ticket_mapping.transaction_id AND isClosed = 1 ) AND header.restaurant_number = 1606 GROUP BY header.restaurant_number, transaction_id Having lowDollarModified > 0 as t`)
->groupBy(`t.restaurant_number`)
->get();
这是由以下工具生成的: http : //www.midnightcowboycoder.com/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.