QueryBuilder s vazbou OneToOne a napojení na Ublaboo/Datagrid
- Xchos
- Člen | 40
Ahoj,
zase jsem narazil na úplně triviální problém. Využívám addonu Ublaboo/Datagrid a potřebuji přidat sloupec, který bude vypisovat majitele příspěvku. To se mi povedlo, ale nelíbí se mi moc řešení, jak jsem k výsledku dospěl.
Aktuálně mám komponentu
<?php
$grid = new DataGrid($this, $name);
$grid->setDataSource(
$this->em->getRepository(Entities\Page::CLASSNAME)->createQueryBuilder('er')
->addSelect('u')
->leftJoin('er.owner', 'u')
);
/* Columns */
$grid->addColumnNumber('id', 'Identifikátor')
->setSortable();
$grid->addColumnText('title', 'Nadpis Stránky');
$grid->addColumnText('username', 'Majitel')
->setRenderer(function($item) {
return is_null($item['owner']) ? "---" : $item['owner']['username'];
});
?>
s tím že mám entitu Page, ve které mám vazbu OneToOne na uživatele.
Entita Page obsahuje
<?php
//...
/**
* @ORM\OneToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $owner;
//...
?>
Co potřebuji znát?
- Je nějaké lepší řešení, jak v queryBuilderu napojit tu entitu User?
- Je nějaká možnost vypsat z entity User hodnotu username do datagridu, bez toho rendereru, jak to využívám já?
Díky za odpovědi
- Pavel Janda
- Člen | 977
@Xchos Už přepisuji získávání hodnot z entit doctriny. Bude to fungovat jednoduše tak, že pokud si vytvoříš vazby v entitě, stačí tečkovou notací nastínit, jak ti lezou závislosti. Tedy v tvém případě bude stačit toto:
$grid->addColumnText('username', 'Majitel', 'owner.username');
V entitě use pak něco takového:
public function getUsername()
{
return $this->username ?: '----';
}
- Pavel Janda
- Člen | 977
A nebo budeš mít ten renderer a přistupovat k hodnotám položky budeš jako k objektu (už ne pole).
- Pavel Janda
- Člen | 977
No teď to tak ještě nefunguje.. Dnes už to zalomím, zítra dodělám a dám vědět. :)
Jojo, další parametr je název sloupce, pokud by se měl specifikovat jinak.
- Pavel Janda
- Člen | 977
@akadlec To byl příklad :D
Stejně tak lze při zachování funkcionality asi napsat:
$column->setRenderer(function($page) {
return is_null($page->getOwner()) ? "---" : $page->getOwner()->getUsername();
});
@Xchos Je to zatím neotagované v masteru. Můžeš to zkusit? Večer bych to přidal do dokumeetace, napsal testy a otagoval.