Přepis SQL do QueryBuilderu

Michwuanquana
Člen | 22
+
0
-

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)

David Grudl
Nette Core | 8227
+
0
-

Nedělej to. Mrkni místo toho na nějaký seriál na Netflixu

Michwuanquana
Člen | 22
+
0
-

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)

Kcko
Člen | 468
+
0
-

Michwuanquana napsal(a):

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?

Kde vidíš dva? Já vidím jeden.

Editoval Kcko (13. 5. 2022 8:59)

Michwuanquana
Člen | 22
+
0
-

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)