Nette\Database LEFT JOIN místo INNER JOIN

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

Mám zapsáno

$service->where('products.category_id = ? OR related_category:category_id = ?', $id, $id);

což mi vytvoří sql

FROM `products`
INNER JOIN `related_category` ON `products`.`id` = `related_category`.`product_id`
WHERE (`products`.`category_id` = '41' OR `related_category`.`category_id` = '41')

Jak mám dosáhnout toho, že místo INNER JOIN bude LEFT JOIN? Jak byste tento dotaz zapsali, jestliže by místo (int) $id bylo (array) $ids? Zkoušel jsem WHERE products.category_id IN (?) ale nefunguje.

Nette v nejnovější verzi z github.

hrach
Člen | 1834
+
0
-

neco takoveho

$service->where('products.id NOT NULL')->where('related_category:category_id = ?', $id);
Ivorius
Nette Blogger | 119
+
0
-

Možná jsme se nepochopili. Jedná se o Nette\Database\Selection s tabulkou products

Já potřebuji najít všechny produkty, které mají nastavenou kategorii $id (products.category_id – když jsem nechal jen category_id, tak mi to vyhazovalo že je column ambiguously) nebo mají záznam v tabulce related_category.category_id (m:n tabulka)

Ivorius
Nette Blogger | 119
+
0
-

Není chyba v Sqlbuilder.php ? Na řádku 316 je . (!isset($joins[$name]) && $inner && !isset($match[3]) ? 'INNER' : 'LEFT')

Nemělo by tam být $match[2] ?

Editoval Ivorius (27. 9. 2012 11:10)

hrach
Člen | 1834
+
0
-

sorry, blbe sem si to precetl. ano, mas pravdu, toto nebude bug, to bude vlastnost. Proste nette proi porminkach pres where vytvari inner joiny, Uz davno sirikam, ze to zrusim, bohuzel to bude bc break. Notorm toto nema. Jde o to, ze dospecifikavat where na inner join jde, narozidil od opacneho pripadu, ktery mas ty.

Prozataim doporucuji fork nette a rebasovat si opravny commit.

David Matějka
Moderator | 6445
+
0
-

myslím, že by to mělo jít i v té refaktorované nette database (používám to ve starší) tak, že tu relaci na tu tabulku tam dáš 2×, zkus možná něco ve stylu:

<?php
$service->where('products.category_id = ? OR related_category:category_id = ?', $id, $id)
	->where('related_category:category_id = related_category:category_id');
?>

(nebo nějakou jinou podmínku, která neovlivní výsledek)

Editoval matej21 (27. 9. 2012 11:47)

gawan
Člen | 110
+
0
-

nebolo by najlepšie pridať niečo ako setDefaultJoinType() a keď to niekto potrebuje, tak si to nastaví na LEFT, ale hlavne to nebude BC break a môže sa to tam pridať hneď.