@SWFaust

Laravel 5 Collection. Почему на локальной машине Sum работает, а на сервере нет?

Добрый вечер!
Наткнулся на очень странную странность. А именно на вот что:
Использую метод sum коллекции laravel полученной из Eloquent.
$oReferalls->each(function($oRefer){
$oRefer->deposits->each(function($oDeposit){ 
                $oDeposit['onepays'] = $oDeposit->payments->where('purpose',3)->sum('amount');
                $oDeposit['perpays'] = $oDeposit->payments->where('purpose',4)->sum('amount');              
            });        
            $oRefer->onepays    = round($oRefer->deposits->sum('onepays'),2);
            $oRefer->perpays    = round($oRefer->deposits->sum('perpays'),2);
        });

Собственно на локальной машине (OpenServer) все отрабатывает как надо. Все суммируется верно. На сервере же ничего не суммируется.
Вывел коллекцию через dd на локалке и на сервере - обнаружил такой момент:
На сервере все числа как строки воспринимаются (собственно на сколько я понимаю это и логично, вроде как все числовые данные из БД возвращаются как строки).
Собственно вопрос такой, почему Laravel в одних условиях преобразует к числам строки, а в других нет. Может быть кто-то сталкивался с подобным... Или быть может дело вообще не в laravel, а в настройки php или mysql стоит копать (в принципе, и покопал сразу, сравнил конфиги, разницы не нашел принципиальной)?

upd
Собственно, как оказалось - дело не в строковых значения. Прогнал для теста суммируемую коллекцию в цикле и преобразовал во всех записях поле суммируемое к числу. Не помогло. Результат тот же, на локалке сумировалось нормально, на сервере нет.
Пока решил таким образом:
$aSums = ['onepays'=>0, 'perpays'=>0];
                $oDeposit->payments->each(function($oPayment) use (&$aSums){
                    $oPayment->amount = doubleval($oPayment->amount);
                    if($oPayment->purpose == 3){
                        $aSums['onepays'] += $oPayment->amount;
                    }elseif($oPayment->purpose == 4){
                        $aSums['perpays'] += $oPayment->amount;
                    }                    
                });
                $oDeposit['onepays'] = $aSums['onepays'];
                $oDeposit['perpays'] = $aSums['perpays'];

Но как-то это не особо красиво, когда агрегатный метод есть для этого... Хотелось бы понять почему он работает через раз..
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
Denormalization
@Denormalization
Скорее всего проблема в функции Collection::where(), она использует строгое(===) сравнение.

Попробуйте использовать функцию Collection::whereLoose(), которая использует не строгое (==) сравнение.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Croshim
Используйте mysqlnd драйвер для дб. Если вы на убунте, то:
sudo apt-get install php5-mysqlnd
рестарт nginx/apache
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы