LEFT JOIN na mimo PK pomoci NTD

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honzy
Člen | 22
+
0
-

Ahoj, mam dve tabulky.

inzerat(id_inzerat, nazev, …, id_user)
firma(id_firma, nazev_firma, …, id_user)

a rad bych mel dotaz:

SELECT id_inzerat, nazev, nazev_firma
FROM inzerat
LEFT JOIN firma ON inzerat.id_user =
firma.id_user
WHERE schvaleno = 1 AND firma.id_user = 10

v modelu mam:

<?php
	$table->where('schvaleno', 1);
	$table->where('firma.id_user', 10);
?>

protoze navrh databaze nemuzu menit, napsal jsem si vlastni reflection, vysledny join je ale:

SELECT id_inzerat, nazev, nazev_firma
FROM inzerat
INNER JOIN firma ON inzerat.id_user =
firma.id
WHERE schvaleno = 1 AND firma.id_user = 10

nazev joinovane tabulky stejne jako id_user v ON je dobre z reflection, proc to ale bere id jako PK z firmy? Resp. jak mu rict, ze to chci joinout pres id_user? A jak tam lze vecpat LEFT JOIN? Pokud inzerat nema firmu, tak ho chci taky.

vvoody
Člen | 910
+
0
-

NDB vždy joinuje len na PK, tu ti ani úprava reflection nepômože. Jedine že by si do query joinol najskorej user tabuľku a až potom firmu.

Honzy
Člen | 22
+
0
-

a jak se potom takove dotazy resi? nejaky best practice postup na to je?

(nejlepe nejak dostat Nette\Database\Table\Selection, at to mohu napojit na jiz hotove strankovani :) )

vvoody
Člen | 910
+
0
-

Moc nechápem čo ťa k tomuto query vedie ale mohlo by fungovať toto.

	$table->where('schvaleno', 1);
	$table->where('user:firma.id_user', 10);
sKopheK
Člen | 207
+
0
-

Nejsem úplně moudrý z nastíněného schématu db, ale předpokládám, že chceš vytáhnout všechny schválené inzeráty, které patří firmě daného uživatele, čili klasický join přes tabulku, se kterým NDB není příliš velký kamarád. Pokud potřebuješ jen ta data třeba v poli, tak než se s tím nějak dlouho párat, napiš si to standardně přes PDO:

$query = 'SELECT id_inzerat, nazev, nazev_firma
FROM inzerat
LEFT JOIN firma ON inzerat.id_user =
firma.id_user
WHERE schvaleno = 1 AND firma.id_user = 10';

$pdo = $table->getConnection()->getPdo();
$rows = $pdo->query($query)->fetchAll(\PDO::FETCH_ASSOC);
Honzy
Člen | 22
+
0
-

@vvoody: mam vyhledavaci formular, ktery uz funguje a nad inzeraty dela filtraci a vysledny selection se preda do strankovani. fungovalo to bezvadne do doby, nez jsem potreboval udelat tento JOIN… To cos poslal udelalo join pres users a stejne zase pres ID :( Navic jeste inner…

@sKopheK: tak samo to jde udelat pres query(Args), ale to bych musel delat strankovani znovu :( Mam napsanou jednu fci pro vsechny, no co uz. Vlastne nechapu, proc to NDB vubec je, kdyz je tam nepouzitelny JOIN, coz je zaklad pro vypis. Mohl jsem to napsat rovnou v dibi, dobre mi tak :)