Wpis z mikrobloga

Witajcie mirki.
Taka sytuacja. Mam w bazie danych 2 tabele: user, product i vote. W tabeli vote zapisuję:
userid | type | recordid. W polu userid przechowuję id użytkownika który głosował, w polu type przechowuję typ głosowania (użytkownik lub produkt), w polu recordid przechowuję id rekordu z tabeli user lub product.
Chciałbym pobrać ile głosów zostało oddane na użytkownika, dlatego napisałem taki SQL:
SELECT
*,
COUNT(v.record_id) AS user_votes
FROM user AS u
LEFT JOIN vote AS v ON v.record_id = u.id
WHERE u.roles LIKE '%ROLE_DESIGNER%'
GROUP BY u.id

Nie wiem jak to zapisać w doctrine query builder, ponieważ taki zapis:

$qb = $this->createQueryBuilder('u');
$qb->leftJoin('u.userVote', 'v');
$qb->select('u');
$qb->addSelect('COUNT(v.recordId) AS user_votes');
$qb->where("u.roles LIKE '%ROLE_DESIGNER%'");
$qb->addOrderBy('user_votes', 'DESC');
$qb->addGroupBy('u.id');

robi JOIN według userid, przez co otrzymuję niepoprawny wynik. Próbowałem użyć WITH o w taki sposób:

$qb = $this->createQueryBuilder('u');
$qb->leftJoin('u.userVote', 'v', 'WITH', 'v.recordId = u.id');
$qb->select('u');
$qb->addSelect('COUNT(v.recordId) AS user_votes');
$qb->where("u.roles LIKE '%ROLE_DESIGNER%'");
$qb->addOrderBy('user_votes', 'DESC');
$qb->addGroupBy('u.id');

Ale otrzymałem nie do końca poprawny rezultat, tzn. poprawnie musi być tak:
user1 - 1 głos
user2 - 1 głos
user
3 - 0 głosów
ja otrzymałem:
user1 - 1 głos
user
2 - 0 głosów
user_3 - 0 głosów

W jaki sposób zrobić JOIN na polach nie zmapowanych w encjach?

#php #doctrine #symfony2 #symfony
  • 1
@mariecziek: Whatever, rozwiązałem to w taki sposób:

$query = $this->getEntityManager()->createQuery("SELECT u, COUNT(v.recordId) as user_votes
FROM AppBundle\Entity\User u
LEFT JOIN AppBundle\Entity\Vote v WITH v.recordId = u.id
WHERE u.roles LIKE '%ROLE_DESIGNER%'
GROUP BY u.id
ORDER BY user_votes DESC");

Nie ma to jak SQL ()