ublaboo/datagrid s nextras/orm: filtrování a select sloupců

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

Ahoj,
používám ublaboo/datagrid s nextras/orm.
Mám entitu A a entitu B. Jsou ve vztahu m:n. V A tedy existuje ManyHasMany A::$bs a v B je ManyHasMany B:$as.
Vše spojuji v tabulce a_x_b dle nextras/orm. Platí tedy, že A přiřadím více B a naopak.
V entitě B existuje vlastnost „name“ (string).

V datagridu všech A chci filtrovat B names.

$grid->setDatasource($aRepository->findAll())
$grid->addColumnText('b_name', 'B name');
$grid->addFilterText('b_name', 'B name');

nebo

$grid->setDatasource($aRepository->findAll())
$grid->addColumnText('b_names', 'B names');
$grid->addFilterText('b_names', 'B names');

Latte datagridu:

{extends $original_template}
{define col-b_names}
	{foreach $item->bs as $b}
		{$b->name}{sep} {/sep}
	{/foreach}
{/define}

V datagridu vypisování kategorií krásně funguje.
Rád bych nejen vypisoval, ale i filtroval B::$name.

Šel jsem na to tak, že jsem si pro datagrid definoval v orm v AMapper metodu, která vrací builder, kde jsou selecty, které vrací něco jako CONCAT(B::$name, ' ', B::$name, ' ', B::$name …) as b_names (připojuji ještě joiny, abych se dostal k B::$name). Zkoušel jsem to metodou $builder->addSelect() i select(). Přijde mi ale, že dotazy datagridu vždy přepíšou můj select a zkouší se nejdřív ptát:

SELECT COUNT(*) FROM `as` WHERE (`b_names` LIKE '%vyhledavany_retezec%')

Jenže Dbal vyhodí Nextras\Dbal\QueryException: Unknown column ‚b_names‘ in ‚where clause‘
Kam se ale ztratil můj $builder->select(„CONCAT(B::$name, B::$name, B::$name …) as b_names“) s left joiny?
Dle mé zkušenosti z jiných případů se joiny zachovají, ale selecty datagridový dotaz vždycky přepíše.

Pak mě kvůli filtrování napadlo si ještě v entitě A definovat {virtual} bNames s getterBNames, kde bych vracel řetězec spojující B::$name + B::$name… Výpis bNames tímto způsobem v datagridu funguje, ale filtrování vůbec nebere v potaz, že v entitě existuje bNames a vesele si pokládá dotazy typu SELECT COUNT(*) (výše).

Řešil někdo něco podobného? Napadá vás nějaké jiné řešení?

Děkuju za všechny komentáře.

Čamo
Člen | 798
+
0
-

Akurát riešim niečo podobné a tiež by ma zaujímala odpoveď.