Autor Zpráva
Jirin
Profil
Zdravím,
mám entitu, u každé entity může být hodnocení. Ty hodnocení ukládám do další entity. 1:N vazba. A ted potřebuji nějak získat průměrnou hodnotu hodnocení. Jak ot nejlépe řešit, mě napadlo pouze napsat si DQL, a tam vybrat entitu + avg('r.rating') - jenže, chtěl bych pracovat pak s entitou jako celkem, abych si prostě sáhl na $entita->getRating() a dostal ten průměr. Když to proženu přes DQL tak dostanu oddělenou entitu a oddělený výsledek. Jak se tohle ideálně řeší?

Mě napadli dvě řešení:
1. u první entity si udělat atribut (v dtb tedy další sloupec), který v sobě bude držet aktuální hodnocení
2. udělat si pomocný atribut, který nebude v dtb a po zavolání dql mu nastavím to správné hodnocení. nicméně tam to může způsobovat celkem nekonzistentnosti.


Jak by se to mělo správně řwšit?
Lkopo
Profil *
Môžete poslať prosím zdrojové kódy tých entít, kde uvidíme daný vzťah a čo ste zatiaľ vymysleli?
Jirin
Profil
Ta halvní entita:
/**
* @ORM\Entity
*/
Class Game{
...
    /**
     * @ORM\OneToMany(targetEntity = "Rating", mappedBy = "game", cascade = {"persist", "remove"}, fetch = "EXTRA_LAZY")
     */
    protected $ratings;¨
...
}

a tady je pak entita Rating osekaná:
/**
 * @ORM\Entity
 * @ORM\Table(name = "game_rating")
 */
class Rating
{
...
    /**
     * @ORM\ManyToOne(targetEntity = "Game", inversedBy = "ratings")
     */
    protected $game;
...
}

No a co jsem vymyslel, tak jsem nevymslel nic světoborného jak jsem popsal výše, tady je to DQL:
$qb = $this->gameDao->createQueryBuilder();
        $qb->select('g', 'avg(r.rating)')
            ->from('Game', 'g')
            ->join('Rating', 'r')
            ->where('g.slug = :slug')
            ->setParameter('slug', $slug);
        $game = $qb->getQuery()->getSingleResult();

což mi vrátí pole o pod indexem 0 je entita Game a druhy je hodnota toho avg()

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: