Doctrine + Kdyby\Doctrine\QueryObject – vytiahnutie dát do gridu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mbskot
Člen | 42
+
0
-

Zdravím,

robím na jednom projekte, kde podstatnú časť systému predstavujú tabuľky(gridy). V aplikácii používam Kdyby/Doctrine a Nette 2.3.0.

Najskôr som grid skúšal vytvoriť pomocou Grido\Grid, no vzdal som to. Nepodarilo sa mi tam grid vytvoriť pre požadovaný dopyt.

Tak som si spravil jednoduchú komponentu, ktorá je presne na mieru, tomu, čo potrebujem (ani náhodou sa nesnažím spraviť ďalšie Grido, aby sme sa chápali :-)). Dáta do tejto komponenty ťahám cez QueryObject.

class LoansQueryObject extends \Kdyby\Doctrine\QueryObject
{
	const SORT_BY_AMOUNT = 'loan.amount',
		SORT_BY_RATE = 'loan.rate',
		SORT_BY_TERM = 'loan.term',
		SORT_BY_INVESTMENTS = 'numberOfInvestments',
		SORT_BY_FUNDED = 'funded';


	/** @var array */
	private $sortBy = array ();


	/**
	 * @param array $sortBy
	 */
	public function setSortBy(array $sortBy)
	{
		$this->sortBy = $sortBy;
	}

	/**
	 * @param \Kdyby\Persistence\Queryable $repository
	 */
	protected function doCreateQuery(\Kdyby\Persistence\Queryable $repository)
	{
		$query = $repository->createQueryBuilder('loan');
		$query->addSelect('COUNT(investment) AS HIDDEN numberOfInvestments')
			->addSelect('SUM(transaction.amount) AS HIDDEN funded')
			->innerJoin('loan.investments', 'investment')
			->groupBy('loan');

		if (!empty($this->sortBy))
		{
			foreach ($this->sortBy as $column => $direction)
			{
				$query->addOrderBy($column, $direction);
			}
		}

		return $query;
	}
}

Ako je vidieť, aby bolo možné zoradiť grid aj podľa funded alebo numberOfInvestments, no zároveň aby som v ResultSet potom dostal pole entít, použil som AS HIDDEN. Problém je v tom, že ja by som tie polia chcel dostať do výstupu, ale nejako pekne. A teda mám 2 možnosti:

1. neselektovať to ako HIDDEN a dostať škaredý výstup z QueryObject pre jeden záznam ako:

array (0 => LoanEntity, 'numberOfInvestments' => 5, ...)

2. nechať to HIDDEN a tieto údaje si znova nejako sám vypočítať pri vykresľovaní (to sa mi moc nepáči, lebo jednak robím to isté 2× a hrozí ne-konzistentnosť z DQL a ručného výpočtu)

Vie mi niekto poradiť, ako toto riešiť? Rád by som to robil správne.

Vďaka za pomoc.

Filip Procházka
Moderator | 4668
+
0
-

Mně osobně ten výstup s entitou pod klíčem 0 nepřijde škaredý :) Stačí v datagridu kouknout, jestli máš pole entit, nebo v prvním prvku toho resultsetu je entita pod 0.

mbskot
Člen | 42
+
0
-

Vďaka :). Chcel som sa len uistiť, či neexistuje nejaké lepšie (krajšie) riešenie.