ublaboo/datagrid + doctrine + počet OneToMany
- jonyssss
- Člen | 3
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í.