/** * @return Twig_SimpleFunction */ public function journalCategories() : Twig_SimpleFunction { return new Twig_SimpleFunction('journalCategories', function (TransactionJournal $journal) : string { $cache = new CacheProperties(); $cache->addProperty($journal->id); $cache->addProperty('transaction-journal'); $cache->addProperty('category-string'); if ($cache->has()) { return $cache->get(); } $categories = []; // get all categories for the journal itself (easy): foreach ($journal->categories as $category) { $categories[] = '<a href="' . route('categories.show', [$category->id]) . '" title="' . e($category->name) . '">' . e($category->name) . '</a>'; } if (count($categories) === 0) { $set = Category::distinct()->leftJoin('category_transaction', 'categories.id', '=', 'category_transaction.category_id')->leftJoin('transactions', 'category_transaction.transaction_id', '=', 'transactions.id')->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id')->where('categories.user_id', $journal->user_id)->where('transaction_journals.id', $journal->id)->get(['categories.*']); /** @var Category $category */ foreach ($set as $category) { $categories[] = '<a href="' . route('categories.show', [$category->id]) . '" title="' . e($category->name) . '">' . e($category->name) . '</a>'; } } $string = join(', ', array_unique($categories)); $cache->store($string); return $string; }); }