Во-первых, я думаю, что в вашем коде есть ошибка. Вместо $invoice->$items
вы, вероятно, имели в виду $invoice->items
.
Ответом на ваш вопрос может стать стремительная нагрузка. Вместо:
$invoice = Invoice::find($id);
попробовать:
$invoice = Invoice::with([
'items' => function ($q) {
$q->with('subItems');
}
])->find($id);
Таким образом, все будет загружено в одном запросе. В настоящее время вы делаете count($invoice->items) + 1
запросов. Это называется проблемой N + 1, и об этом очень важно знать.