减少查询Yii2

时间:2018-12-03 12:06:12

标签: mysql sql arrays yii2

我真的很喜欢这个。

我有一张带合同的桌子,一个带物品的桌子。 我m trying to achieve is to see the total quantity of an item on contracts in a date range for every day. For example, item1 appears on 3 contracts on Monday and the total quantity is 30. Currently, I在选定日期范围内每天使用查询进行一次while循环

$itemQty = ContItems::find()
            ->where(['ITEMNO' => $itemNo])
            ->andWhere(['<=' , 'HIREDATE' , $today])
            ->andWhere(['>=' , 'ESTRETD' , $today])
            ->andWhere(['or',
                ['STATUS' => 0],
                ['STATUS' => 1]
            ])
            ->SUM('QTY');

它工作正常,但我想检查在选定日期范围内每天的每一件物品,如果这样做,查询数量最多可以超过5万。

我试图做的是在日期范围内选择每个合约并存储在数组中 每个合同都有开始和结束日期,我想选择开始或结束日期在我指定的日期范围内的每个合同。

$ContItemsArray = ContItems::find()
            ->where(['or',
                        ['<=' , 'HIREDATE' , $dateFrom],
                        ['<=' , 'HIREDATE' , $dateTo],
                        ['>=' , 'HIREDATE' , $dateFrom],
                        ['>=' , 'ESTRETD' , $dateTo],
                        ['>=' , 'ESTRETD' , $dateFrom]
                    ])
            ->andWhere(['or',
                ['STATUS' => 0],
                ['STATUS' => 1]
            ])
            ->asArray()
            ->all();

并使用此代码计算数量

$theQty = 0;    
        foreach ($ContItemsArray as $subArray) 
        {   
            if ($subArray['ITEMNO'] == $itemNo && ($subArray['HIREDATE'] <= $today && $subArray['ESTRETD'] >= $today) && ($subArray['STATUS'] <= 1))
            {   
                $theQty += $subArray['QTY'];
            }
            else 
            {
                $theQty += 0;
            }       
        }

但是它返回的数字不正确,由于某种原因合同缺失,我无法弄清楚原因。 我试图更改$ ContItemsArray的查询,但是没有运气。 我希望我对这个问题足够清楚。 我将不胜感激。

编辑: ContItems表包含所有合同,合同编号为“ ITEMNO”,开始日期为“ HIREDATE”,结束日期为“ ESTRETD”,数量为“ QTY”字段。

我有一个数组,其中包含要检查的所有项目编号。 预期的结果是,如果我检查的日期在合同的开始日期和结束日期之间,则对项目的数量求和。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,不得不在表中的日期(HIREDATE,ESTRETD)上使用date('Y-m-d')和strtotime,现在工作正常了