From e64b40d58bd84aa4daf056e737a8bfeab1346dcf Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 14 May 2016 22:11:49 +0200 Subject: [PATCH] Experimental query. [skip ci] --- .../Account/AccountRepository.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 169b3fcae1..3ac9824495 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -13,6 +13,7 @@ use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; use Log; @@ -323,8 +324,25 @@ class AccountRepository implements AccountRepositoryInterface } if ($accounts->count() > 0) { $accountIds = $accounts->pluck('id')->toArray(); - $query->leftJoin('transactions as t', 't.transaction_journal_id', '=', 'transaction_journals.id'); - $query->whereIn('t.account_id', $accountIds); + $query->leftJoin( + 'transactions as source', function (JoinClause $join) { + $join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('amount', '<', 0); + } + ); + $query->leftJoin( + 'transactions as destination', function (JoinClause $join) { + $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id')->where('amount', '>', 0); + } + ); + + // XOR. must be either. + $query->where( + function (Builder $query) use ($accountIds) { + $query->whereIn('source.account_id', $accountIds, 'xor') + ->whereIn('destination.account_id', $accountIds, 'xor'); + } + ); + } // that should do it: $complete = $query->get(TransactionJournal::queryFields());