QueryBuilder s vazbou OneToOne a napojení na Ublaboo/Datagrid

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

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
+
+2
-

@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
+
0
-

A nebo budeš mít ten renderer a přistupovat k hodnotám položky budeš jako k objektu (už ne pole).

Xchos
Člen | 40
+
0
-

Paráda, děkuju moc. Já jsem to tam ládoval jako $grid->addColumnText('owner.username', 'Majitel'); a to mi nefunngovalo. Proto jsem se začal pídit tady a třetího parametru jsem si nějak nevšiml. Díky za vysvětlení.

Pavel Janda
Člen | 977
+
0
-

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.

Xchos
Člen | 40
+
0
-

JoJo, to mi došlo, zatím si tam necham tenhle workaround. Jak to bude hotové tak děj vědět, ať to předělám :)

akadlec
Člen | 1326
+
0
-
public function getUsername()
{
    return $this->username ?: '----';
}

ale fuj…

Pavel Janda
Člen | 977
+
+1
-

@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.

Xchos
Člen | 40
+
0
-

@PavelJanda Pro všechny případy, které jsem řešil mi to fungovalo, tak se zdá že je problém zažehnán :) .. díky za rychlé řešení :)

Pavel Janda
Člen | 977
+
+1
-

Super. Večer vyjde nová verze. :D

Pavel Janda
Člen | 977
+
0
-

Vyšla – viz