Grido + Doctrine ako pristupovať k spojeniam

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

Zdravím,
viem mi prosím vás niekto povedať, prečo v nasledujúcom kóde musím v nastavení stĺpcov pre pripojenú tabuľku user písať user.name a user.email? V examploch pre stĺpec country stačí písať country. Mne to ale bez toho user. hádže exception, že stĺpec name/email neexistuje v entite Article.

	protected function createComponentGrid($name)
	{
		$grid = new Grido\Grid($this, $name);

		$repository = $this->database->getRepository( Model\Entity\Article::class );

		$model = new Grido\DataSources\Doctrine(
			$repository->createQueryBuilder('a') // We need to create query builder with inner join.
			->addSelect('u')                     // This will produce less SQL queries with prefetch.
			->innerJoin('a.user', 'u'),
			array('name' => 'u.name', 'email' => 'u.email'));  // Map name column to the name of the user entity...

		$grid->model = $model;


		$grid->addColumnText('user.name', 'Name')
			->setSortable()
			->setFilterText();

		$grid->addColumnEmail('user.email', 'Email')
			->setSortable()
			->setFilterText();

		$grid->addColumnText('title', 'Title')
			->setSortable()
			->setFilterText();


		$grid->filterRenderType = $this->filterRenderType;

	}

Druhý problém čo s tým mám je že to neradí a nefiltruje. Hádže mi takýto error:

[Semantical Error] line 0, col 101 near 'user__name A': Error: Class App\Model\Entity\Article has no field or association named user__name

**DQL:**
SELECT a, u
FROM App\Model\Entity\Article a
INNER JOIN a.user u
WHERE a.title LIKE :mmfg0
ORDER BY a.user__name ASC

Editoval Čamo (28. 10. 2015 2:49)

Oli
Člen | 1215
+
0
-

Zkus to dát do setColumn nebo do ->setFilterText()->setColumn(); Vím, že jsem si s tím taky zažil trochu wtf momenty. Nakonec to nějak šlo, ale nepřišel jsem na to, kdy/proč to jde…

Jiří Nápravník
Člen | 710
+
0
-

Neměl bys tam mít u.name a u.email, kdyz ma alias u a ne user?

Čamo
Člen | 798
+
0
-

Oli napsal(a):

Zkus to dát do setColumn nebo do ->setFilterText()->setColumn(); Vím, že jsem si s tím taky zažil trochu wtf momenty. Nakonec to nějak šlo, ale nepřišel jsem na to, kdy/proč to jde…

Skúšal som hádam všetky modifikácie vrátane setColumn(). Ale hlavne v examploch , ktoré mi na locale aj fungujú žiadne setColumn(‚country‘) nieje.

Jiří Nápravník napsal(a):

Neměl bys tam mít u.name a u.email, kdyz ma alias u a ne user?

Bez toho user to hádže unknown column $name… Skúšal som samozrejme aj u.name ale z toho vyjde rovnaký error.

Idem sa v tom teraz ešte rýpať. Každý nápad ocením.

Čamo
Člen | 798
+
0
-

Hmm,
podarilo sa mi nájsť jedno riešenie, ktoré ten môj problém rieši, len je to trochu neohrabané. A hlavne sa to nepodobá na riešenie z examplu.
Teraz ten kód vyzerá takto:

	protected function createComponentGrid($name)
	{
		$grid = new Grido\Grid($this, $name);

		$repository = $this->database->getRepository( Model\Entity\Article::class );

		$model = new Grido\DataSources\Doctrine(
			$repository->createQueryBuilder('a')
			->addSelect('u')
			->innerJoin('a.user', 'u'),
			array('user.name' => 'u.name', 'user.email' => 'u.email'));
			// array('country' => 'c.title'));      // Original Grido example

		$grid->model = $model;


		$grid->addColumnText('id', 'Id')
			->headerPrototype->style = 'width: 40px';


		$grid->addColumnText('name', 'Name')
			->setColumn('user.name')
			->setSortable()
			->setFilterText();

		$grid->addColumnEmail('user.email', 'Email')
			->setColumn('user.email')
			->setSortable()
			->setFilterText();

		$grid->addColumnText('title', 'Title')
			->setSortable()
			->setFilterText();
		$grid->getColumn('title')->headerPrototype->style = 'width: 40%';

	}

Teraz to aj radí aj filtruje. Len nechápem ako je možné, že v tom príklade to funguje bez pridania setColumn().

Editoval Čamo (29. 10. 2015 4:53)