Přepis SQL do QueryBuilderu
- Michwuanquana
- Člen | 22
Zdravím, snažím se přepsat SQL dotaz do QueryBuilderu, ale u takhle komplikovanějšího nevím, jak na to…
Dotaz je:
SELECT `user`.*
FROM `user`
JOIN `friends` ON `user`.`id` != $uid AND (`user`.`id` = `friends`.`origin` OR `user`.`id` = `friends`.`destination`)
WHERE `friends`.`origin` = $uid OR `friends`.`destination` = $uid;
Má vrátit seznam uživatelů – kamarádů určitého uživatele. Tabulka
Friends
se zkládá z unikátního ID, položky
origin
a destination
, kde origin
je User
ID toho, kdo požádal o přátelství a destination
je User ID
člověka, kterého chce za přítele. Ten dotaz má vypsat kamarády určitého
uživatele, jehož seznam se může skládat jak z přátelství, které
započal on, tak i z těch, o ktéré ho někdo požádal, proto je to tak
jak to je. Momentálně to je řešeno vytažením záznamu z
friends
, ze kterého se v PHP udělá pole, které následně
vytáhne požadované uživatele z users
, nelíbí se mi, že to
zabere 2 dotazy a zbytečná logika v PHP…
public function getFriends(int $uid, int $state = Friends::STATE_FRIENDS) {
$friendsData = $this->em->getFriendsRepository()->findFriends($uid, $state);
$fids = [];
foreach($friendsData as $friendship) {
$fids[] = ($friendship->getOrigin() === $uid) ? $friendship->getDestination() : $friendship->getOrigin();
}
return $this->em->getUserRepository()->findUsers($fids);
}
Každá tabulka má samozřejmě své entity
use App\Model\Database\Entity\User;
use App\Model\Database\Entity\Friends;
Díky za případné rady.
Editoval Michwuanquana (12. 5. 2022 23:31)
- Michwuanquana
- Člen | 22
David Grudl napsal(a):
Nedělej to. Mrkni místo toho na nějaký seriál na Netflixu
To průběžně dělám. Je blbost řešit, že to jde ve dvou dotazech?
Editoval Michwuanquana (12. 5. 2022 23:40)
- Michwuanquana
- Člen | 22
V puvodni funkci getFriends se nejdriv vola findFriends – prvni dotaz, nasledne se vezme pole s id uzivatelu a podle toho se vyhledaji (findUsers) – druhy dotaz. To SQL to vyresi jednim dotazem, jen nevim jak to prepsat, aby to vratilo pole entit User
No asi než to dělat v QueryBuilderu, tak to jednoduše převést do DQL, což mě hned nenapadlo…
SELECT u
FROM App\Model\Database\Entity\User u
JOIN App\Model\Database\Entity\Friends f WITH u.id != :uid
AND (u.id = f.origin OR u.id = f.destination)
WHERE f.origin = :uid OR f.destination = :uid
Editoval Michwuanquana (13. 5. 2022 17:45)