Я думаю, что функции выглядят как "if-y", потому что ваши операторы сложнее, чем они должны быть.Также вы всегда загружаете все свои запасные варианты, что не всегда необходимо.Я бы реорганизовал функцию для загрузки следующего уровня только при необходимости.Это может выглядеть примерно так:
private function addDefaultOnlineCommission ( Price $price ) {
// load the type commission
$commission = $price->type->commissions()->where( 'is_online', '=', true )->first();
// if there is no type commission, check client commission
if( empty($commission) ){
$commission = $price->type->client->commissions()->where( 'is_online', '=', true )->first();
}
// if there is no client commission either, fall back to the default
if( empty($commission) ){
$commission = (object)Commission::DEFAULT_COMMISSIONS;
}
$price->commissions()->create( [
'commission_type' => $commission->commission_type,
'commission_value' => $commission->commission_value,
'min_value' => $commission->min_value,
'is_online' => true,
'valid_from' => Carbon::now()->format( 'Y-m-d H:i:s' ),
] );
}
Это не только уменьшает длину вашей функции, но и делает ее более читаемой imho.Кроме того, вы избегаете ненужных запросов.
Примечание. Вы можете заменить empty () на is_null (), поскольку first () возвращает пустое значение для пустых результатов.