ublaboo/datagrid + doctrine + počet OneToMany

před 6 měsíci

jonyssss
Člen | 3
+
0
-

Zdravím,
potřebuji udělat datagrid s výpisem reklamací a k nim počet nepřečtených komentářů. Mám následující entity ve vztahu OneToMany:

class Reklamace{

    /**
     * @ORM\Column(name="id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /*
        další vlastnosti
    */

    /**
     * @ORM\OneToMany(targetEntity="ReklamaceMessage", mappedBy="reklamace")
     * @ORM\OrderBy({"id" = "DESC"})
     */
    protected $messages;

}

class ReklamaceMessage {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     *
     * @var Reklamace
     * @ORM\ManyToOne(targetEntity="Reklamace")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    protected $reklamace;

    /*
        další vlastnosti
    */

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime", nullable=true)
     */
    protected $read;

}

Potřeboval bych, aby ublaboo dokázalo zpracovat něco jako následují dotaz:

$b = $this->em->createQueryBuilder()
            ->select('r')
            ->addSelect('(SELECT COUNT(rm.id) FROM '.ReklamaceMessage::class.' rm WHERE rm.read IS NULL AND rm.reklamace = r.id) as pocet')
            ->from(Reklamace::class, 'r');

Ale když dám tento dotaz jako detasource tak doctrína vrací správně místo pole entity tak pole ve kterém jsou pole kde je entita a pocet a nevím jak a jestli ublaboo umí s tímto pracovat a nebo je jiný způsob jak to tam dostat? Snad to je srozumitelné.

Další věc co jsem dogooglil je, že do entity reklamace dám něco takového:

public function getCountUnread(){
    $cr = \Doctrine\Common\Collections\Criteria::create()
                        ->where(\Doctrine\Common\Collections\Criteria::expr()->isNull('read'));
    $r = $this->messages->matching($cr);
    return count($r);
}

Ale to se mi nelíbí z hlediska dotazů do db, protože to pro každou reklamaci tahá všechny komentáře a poté to filtruje čož mi nepřijde moc optimální.

Další věc co mě napadla je ukládat si počty do db k reklamaaci a buď pomocí db trigerů nebo event přepočítávat ale to bych viděl jako poslední řešení.