繁体   English   中英

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

[英]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.

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