代码之家  ›  专栏  ›  技术社区  ›  Adesh Kumar

错误:使用此函数时必须指定orderBy子句

  •  0
  • Adesh Kumar  · 技术社区  · 7 年前

    尝试迁移时出现以下错误。实际上,我有很多数据,所以我在laravel中使用了块。

    我使用的是MongoDB而不是SQL

    ** You must specify an orderBy clause when using this function.**
    

    我的迁移文件的up函数是

        public function up()
                    {
            ini_set('max_execution_time', 250); 
            ini_set('memory_limit', '1024M'); 
            $product_array = DB::collection('product')->orderBy('created_at','asc');
            $product_array->chunk(20, function($product_array)
                {       
            $cotationPercentForecast=0;
            $cotationPercent=0;
            $quote_tpl = array();
            foreach ($product_array as $key => $value) {
            if (isset($value['quote_tpl'])) {
            $quote_tpl = $value['quote_tpl'];
            $defaultScoreCount = 0;
            $realScoreCount = 0;
            $forecastScoreCount = 0;
            foreach ($quote_tpl as $idxPerimetre => $perimetre) {
            if (isset($perimetre['families'])) {
            foreach ($perimetre['families'] as $idxFamilies => $family) {
            if (isset($family['subfamilies'])) {
            foreach ($family['subfamilies'] as $idxSubFamilies => $subfamily) {
            if (isset($subfamily['items'])) {
            foreach ($subfamily['items'] as $idxitem => $item) {
            if (isset($item['criterias'])) {
            foreach ($item['criterias'] as $idxcriteria => $criteria) {
                    if (!isset($criteria['inactive']) || $criteria['inactive'] != 'true') {
                            $defaultScoreCount++;
                            if (isset($criteria['real_score'])) {
                              $realScoreCount++;
                            }
                            if (isset($criteria['forecast_score'])) {
                              $forecastScoreCount++;
                            }
                          }
            } // FOREACH CRITERIA
            } // ISSET CRITERIA ### 
            } // FOREACH ITEM                                    
            } // ISSET ITEM ###
            } // FOREACH SUBFAMILY  
            } // ISSET SUBFAMILY  ###
            } // FOREACH FAMILY 
            } // ISSET FAMILY ### 
            }// FOREACH PERIMETER ##
        if ($realScoreCount > 0 && $defaultScoreCount > 0) {
         $cotationPercentUn = ($realScoreCount / $defaultScoreCount) * 100;
         $cotationPercent = round($cotationPercentUn, 2);
        }
        if ($forecastScoreCount > 0 && $defaultScoreCount > 0) {
        $cotationPercentUnForecast = ($forecastScoreCount / $defaultScoreCount) * 100;
         $cotationPercentForecast = round($cotationPercentUnForecast, 2);
        }
    
         $results = DB::collection('product')->update(['cotation_percent' => $cotationPercent,'forecast_cotation_percent' => $cotationPercentForecast]);
    
            }
    
            }
            });
            }
    

    我已经在这里经历了很多答案,几乎所有人都建议使用orderBy,所以我使用了它。但还是有错误。

    我用过

     Product::chunk(5, function($product_array){}
    

    如有任何帮助,我们将不胜感激。提前谢谢。

    0 回复  |  直到 7 年前
        1
  •  4
  •   Mihir Bhende    7 年前

    当Laravel内部使用 enforceOrderBy 里面有定义 Illuminate/Database/Query/Builder .

    当您在由实例化的查询生成器上使用块时 DB 外观 Illuminate\Database\Query\Builder 它会直接问你:

    使用此函数时必须指定orderBy子句。

    所以如果你这样做的话:

    \DB::table('product')->chunk(10, function($product){
        ...
    });
    

    如果您手动在此添加订单,它将 抛出错误并按预期工作:

    \DB::table('product')->orderBy('created_at')->chunk(10, function($product){
        ...
    });
    

    但是,最好直接使用雄辩的模型,这样就不会强制您手动添加order by子句:

    Product::chunk(10, function($product){
        ...
    });
    

    也没有办法 DB::collection() ,您可以使用 DB::table() 如果你愿意,除非你正在使用 mongodb 而不是 MySQL

    推荐文章