Да, похоже это единственное решение, создающее один подзапрос к связанной таблице
Если вдруг кому то только одно поле отношения суммировать, то вот рабочий вариант:
Shop::withSum([
'sales as sum' => function ($q) use ($dateFrom, $dateTo) {
// условие для выборки, если нужно
$q->whereBetween('date', [
$dateFrom->format('Y-m-d'),
$dateTo->format('Y-m-d')
]);
},
]);
Если вдруг кому то только одно поле отношения суммировать, то вот рабочий вариант: