Добрый вечер!
Наткнулся на очень странную странность. А именно на вот что:
Использую метод 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'];
Но как-то это не особо красиво, когда агрегатный метод есть для этого... Хотелось бы понять почему он работает через раз..