Laravel:我如何将此查询转换回雄辩?

问题描述 投票:0回答:2

如何将此查询转换为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();
php mysql laravel
2个回答
0
投票
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/


0
投票

对于提前查询但不需要在存储过程中的任何循环将是你的最后的手段。你可以做一个VIEW TABLE,然后为此创建一个模型。而不是在你的代码中做'whereRaw'

© www.soinside.com 2019 - 2024. All rights reserved.