Jak na Left Join v Nette\Database

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

Tak už vůbec netuším. Jde nějak v NBD nastavit left join?

$this->getTable()->where(array('album:band_id' => NULL));

vyhodí

SELECT `band`.`id`
FROM `band`
INNER JOIN `album` ON `band`.`id` = `album`.`band_id`
WHERE (`album`.`band_id` IS NULL)

bohužel bych to potřeboval s

SELECT `band`.`id`
FROM `band`
LEFT JOIN `album` ON `band`.`id` = `album`.`band_id`
WHERE (`album`.`band_id` IS NULL)

Nette Framework 2.0.8 pro PHP 5.3 nebo 5.4

hrach
Člen | 1838
+
0
-

Hm… bohuzel. Asi by to chtelo zmenit. Tohle zavedl David pro portovani z notormu, zrejme nedomyslel dusledky. Na druhou stranu to bude velky BC break…

newbie
Člen | 31
+
0
-

Tak teď to moc nebude souviset s databázema, ale nějak to na tohle navazuje. Tenhle dotaz mi měl vybrat data pro komponentu. Pokud ji tam zkusím nacpat data přes

$this->connection->query('SELECT *
FROM `band`
LEFT JOIN `album` ON `band`.`id` = `album`.`band_id`
WHERE (`album`.`band_id` IS NULL)');
    }

vyhodí mi to chybu že očekávala Table\Selection. Je nějaká možnost aby komponenta přebrala jak Statement tak Selection? Nebo musím celou databázovou vrstvu přepsat na $this->connection->query('… abych se vyhnul v budoucnosti podobným problémům. Pardon jestli jsem ěnkde něco totálně nepochopil, ale pořád s Nette začínám a QS mám otevřený časteji než svůj projekt.

hrach
Člen | 1838
+
0
-

Ne, bohuzel neni mozne prevest Statement na Selection. To je proste blbej doplnek, mel by vyzadovat \Traversable…

Semik
Backer | 135
+
0
-

Nejsem si úplně jist, ale myslím, že by ta data šla vytáhnout i bez JOINu. NotORM joiny neupřednostňuje, takže to asi nejde logicky.

S přepisováním na query, pozor na SQL injection.

newbie
Člen | 31
+
0
-

Bohužel mi asi nic jiného nezbývá. Pokud se chci do budoucna vyvarovat podobným problémům, nebo když už budu hromadu věcí přepisovat, přemýšlím jestli nepoužít jinou knihovnu :/

Caine
Člen | 216
+
0
-

Jeste muzes pouzit databazovej view;) Myslim, ze kdyz uz vsechno selhava, tohle je v podstate nejjednodussi reseni..

David Matějka
Moderator | 6445
+
0
-

jde to hacknout :) staci tu tabulku pripojit jakoby 2×, zkus

$this->getTable()->where(array('album:band_id' => NULL, 'album:id' => NULL);
enumag
Člen | 2118
+
0
-

Myslím, že by to mělo jít snadno takhle:

$this->getTable()->group('band.id', 'COUNT(album:id) = 0');
vvoody
Člen | 910
+
0
-

+1 za left join, práve ho potrebujem. Pripojenú tabuľku nechcem ale agregovať a je možné že ku niektorým riadkom z hlavnej tabuľky sa nejoine nič z pripojenej, ale stálne to chcem mať v resulte, pre to ten left join. Nejaký hack?