Ошибка: Вы должны указать предложение orderBy при использовании этой функции - PullRequest
0 голосов
/ 20 февраля 2019

При попытке выполнить миграцию я получаю следующую ошибку.На самом деле у меня много данных, поэтому я использовал чанк в laravel.

Я использую MongoDB, а не SQL

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

Моя функция переноса файла миграции -

    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){}

Любая помощь приветствуется.Заранее спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Это предупреждение добавляется, когда Laravel внутренне использует enforceOrderBy, который определен внутри Illuminate/Database/Query/Builder.

Каждый раз, когда вы используете чанк в построителе запросов, инстанцированном DB фасадом Illuminate\Database\Query\Builder, он спрашиваетyou:

Вы должны указать предложение orderBy при использовании этой функции.

Так будет, если вы делаете:

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

ЕслиВы вручную добавляете к этому заказ, он не выдаст ошибку и будет работать как положено:

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

Однако лучше использовать модель Eloquent напрямую, как это не будетпринуждать вас добавлять заказ по предложению вручную:

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

Также нет метода DB::collection(), вы можете использовать DB::table() вместо этого, если хотите, если вы не используете mongodb, а не MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...