Grido + Doctrine ako pristupovať k spojeniam
- Čamo
- Člen | 798
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)
- Čamo
- Člen | 798
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
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)