ublaboo/datagrid + doctrine + počet OneToMany

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

robert.sipek
Člen | 4
+
0
-

Ahoj, řeším teď stejný případ, jak jste to vyřešil? Díky.