Nette\Database LEFT JOIN místo INNER JOIN
- Ivorius
- Nette Blogger | 119
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.
- Ivorius
- Nette Blogger | 119
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)
- hrach
- Člen | 1838
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
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)