如何将此查询转换为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();
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/
对于提前查询但不需要在存储过程中的任何循环将是你的最后的手段。你可以做一个VIEW TABLE
,然后为此创建一个模型。而不是在你的代码中做'whereRaw'
。