雄辩的逻辑重构

时间:2016-01-28 09:50:00

标签: php laravel eloquent

今天我想出了遗留代码。我有一个函数,有时会产生很长的运行时间,并且经常在我们的合作伙伴处发生超时。主要是功能检查剧院的预留座位,但不是获取所有数据并检查空座位,它运行每个座位的查询。 (我认为)它会产生巨大的运行时间。

以下是对应代码:

public function printTicketChaos(){

        $input = Input::all();

        if( isset($input['date_id']) && !isset($input['reserve_id']) ){
            $program_date = \Model\ProgramDate::find($input['date_id']);
            if($input['piece'] > $program_date->available_capacity){
                //dd($input['piece'] . ' ??? ' . $program_date->available_capacity);
                return true;
            }

            $reserved_seats = Session::get('reserved_seats');

            if($reserved_seats != null && count($reserved_seats) > 0){
                foreach ($reserved_seats as $row => $seats) {
                    foreach ($seats as $key => $seat) {

                        $reserve = \Model\Reserve::whereForeignDateId($program_date->id)->whereTableName('programs')->whereHas('seats', function($query) use($row, $seat){ $query->whereRow($row)->whereSeat($seat); })->first();

                        if($reserve != null){
                            return true;
                        }
                        $oi = \Model\OrderItem::whereForeignId($program_date->id)->whereTableName('programs')->whereHas('order', function($query){ $query->whereStorno(0); })->whereHas('seats', function($query) use($row, $seat){ $query->whereRow($row)->whereSeat($seat); })->first();
                        if($oi != null){
                            return true;
                        }
                    }
                }
            }
        }


        return false;
    }

我认为解决方案可能是我查询所有座位,然后检查foreach中的空座位。这是一个好主意,或者您认为哪种方法最好?

代码使用Laravel 4.2

谢谢你的喔!

1 个答案:

答案 0 :(得分:0)

好的,我在查询和逻辑方面做了更改,但它仍然很慢。 系统使用第三方PDF生成器为客户创建“票证”,这就是“坏人”。