, "%s")', $date->format('Y-m-d'))); $return = []; $currencies = []; $cache = new CacheProperties(); $cache->addProperty($accounts->pluck('id')->toArray()); $cache->addProperty('getAccountBalances'); $cache->addProperty($date); if ($cache->has()) { return $cache->get(); } $query = Transaction::whereIn('transactions.account_id', $accounts->pluck('id')->toArray()) ->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') ->orderBy('transaction_journals.date', 'desc') ->orderBy('transaction_journals.order', 'asc') ->orderBy('transaction_journals.description', 'desc') ->orderBy('transactions.amount', 'desc') ->where('transaction_journals.date', '<=', $date) ; $result = $query->get(['transactions.account_id', 'transactions.transaction_currency_id', 'transactions.balance_after']); foreach ($result as $entry) { $accountId = (int) $entry->account_id; $currencyId = (int) $entry->transaction_currency_id; $currencies[$currencyId] ??= TransactionCurrency::find($currencyId); $return[$accountId] ??= []; if (array_key_exists($currencyId, $return[$accountId])) { continue; } $return[$accountId][$currencyId] = ['currency' => $currencies[$currencyId], 'balance' => $entry->balance_after, 'date' => clone $date]; } return $return; } }