Nette\Database: table alias

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

Ahoj potřeboval bych nějak vynutit join přes table alias a získat toto SQL:

SELECT products.*
FROM `products`
LEFT JOIN `params` p1 ON `products`.`id` = `p1`.`products_id`
LEFT JOIN `params` p2 ON `products`.`id` = `p2`.`products_id`
WHERE (`p1`.`param_types_id` = 47 AND `p1`.`value` IN ('110'))
AND (`p2`.`param_types_id` = 49 AND `p2`.`value` IN ('1,3'))

Místo:

SELECT products.*
FROM `products`
LEFT JOIN `params` ON `products`.`id` = `params`.`products_id`
WHERE (`params`.`param_types_id` = 47 AND `params`.`value` IN ('110'))
AND (`params`.`param_types_id` = 49 AND `params`.`value` IN ('1,3'))

Netuším jak na to a lze to vůbec nette database umožňuje. Díky za rady, dotaz skládám takto:

$data = $this->db->table('products');

foreach ($this->filter as $typeId => $values) {
	$data->where("params:param_types_id = ? AND params:value IN (?)", $typeId, $values);
}
redhead
Člen | 1313
+
0
-

Zkus tu podmínku rozdělit:

foreach ($this->filter as $typeId => $values) {
        $data->where("params:param_types_id = ?", $typeId)
		->where("params:value IN (?)", $values);
}
ViPEr*CZ*
Člen | 822
+
0
-

Nemělo by to i tak fungovat dohromady? Co kdyby tam namísto AND bylo OR.

redhead
Člen | 1313
+
0
-

Možná to byl bug, @hrach to teď celé předělával, takže je možné, že je to opraveno. Buď zkusit nejnovější verzi Nette, nebo počkat až se další hrachovi vymoženosti dostanou do Nette (nebo použít jeho vývojovou větvi).

ViPEr*CZ*
Člen | 822
+
0
-

Jj je fakt, že postižený neuvádí jakou verzi používá ;-)

hrach
Člen | 1844
+
0
-

Takove je proste chovani, neni to bug, je to fakt. Popremyslim nad resenim.

Skippous
Člen | 21
+
0
-

@redhead: Rozdělením příjdu o součin v závorce.

WHERE (`params`.`param_types_id` = 47 AND `params`.`value` IN ('110'))

Navíc potřebuji pro každý parametr vynutit join, jinak je výsledek pouze jako kdyby byla podmínka na parametr jedena..

@ViPEr*CZ*: Pardon, verze je 2.0.3. a potřebuji tam mít AND.

@hrach: Ok. Díky za info, myslel jsem si to.

Skippous
Člen | 21
+
0
-

Ahoj, aktualizoval jsem na novou verzi Nette 2.0.9. Zajímalo by mě, jestli se výše uvedené chování dá v této verzi vynutit. Díky

hrach
Člen | 1844
+
0
-

Neda.

qwerin
Člen | 25
+
0
-

mam uplne stejny problem da se to resit nejak v nette 2.1 ? PS. taky produkt a parametry :-)

qwerin
Člen | 25
+
0
-

ps. ono je celkem logicke ze by tohle melo vygenerovat dva joiny:
$conn->table("dr_produkt")->where(" :ns_filtr_item_produkt.id_filtr_item=406")->where(":ns_filtr_item_produkt.id_filtr_item=408 ");

protoze v AND je blbost se ptat na jeden sloupec dvemi hodnotami coz nette DB vygeneruje:

SELECT `dr_produkt.*
FROM dr_produkt
LEFT JOIN ns_filtr_item_produkt ON dr_produkt.id_produkt =
ns_filtr_item_produkt.id_produkt
WHERE (ns_filtr_item_produkt.id_filtr_item=406) AND
(ns_filtr_item_produkt.id_filtr_item=408)`

Eda
Backer | 220
+
0
-

…tohle se přece dá řešit subselectem v klauzuli EXISTS :-)

qwerin
Člen | 25
+
0
-

Takže neco takoveho? .. a jak je to vykonove oprimalni oproti join?

<?php $conn->table(„dr_produkt“)->where(" :ns_filtr_item_produkt.id_filtr_item=406")->where(„dr_produkt.id_produkt“,$conn->table(„ns_filtr_item_produkt“)->select(„id_produkt“)->where(„id_filtr_item=408“)); ?>

SELECT dr_produkt.id_produkt
FROM dr_produkt
LEFT JOIN ns_filtr_item_produkt ON dr_produkt.id_produkt =
ns_filtr_item_produkt.id_produkt
WHERE (ns_filtr_item_produkt.id_filtr_item=406) AND (dr_produkt.id_produkt IN ((1710),
(1760), (1761), (2080)))

qwerin
Člen | 25
+
0
-

tak jo nasel jsem dva BUGy

1.

$conn->table("dr_produkt")
        ->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=406"))
       ->where(array("dr_produkt.id_produkt"=>$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=408")));

vygeneruje

SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=406)

SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=408)

SELECT `id_produkt`
FROM `dr_produkt`
WHERE (`dr_produkt`.`id_produkt` IN ((1710), (1711), (1759), (1761), (2080), (2102))) AND
(`dr_produkt`.`id_produkt` IN ((1710), (1760), (1761), (2080)))

a toto:

$conn->table("dr_produkt")
->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=406"))
        ->where("dr_produkt.id_produkt ?",$this->context->mysql->conn->table("ns_filtr_item_produkt")->select("id_produkt")->where("id_filtr_item=408"));

generuje pouze toto:

SELECT `id_produkt`
FROM `ns_filtr_item_produkt`
WHERE (`id_filtr_item`=406)

SELECT `id_produkt`
FROM `dr_produkt`
WHERE (`dr_produkt`.`id_produkt` IN ((1710), (1711), (1759), (1761), (2080), (2102)))

2. bug pouziti exist.. ale to asi jen neumim pouzit

$conn->table("dr_produkt")
        ->where("EXISTS (SELECT id_produkt FROM ns_filtr_item_produkt WHERE dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt AND ns_filtr_item_produkt.id_filtr_item=406)");
        ->where("EXISTS (SELECT id_produkt FROM ns_filtr_item_produkt WHERE dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt AND ns_filtr_item_produkt.id_filtr_item=408)");

tady join parser zacne parsovat dr_produkt.id_produkt=ns_filtr_item_produkt.id_produkt a skonci chybou

Editoval qwerin (28. 1. 2014 10:04)

Eda
Backer | 220
+
0
-

Pokud píšeš název nějaké kolonky, do které nechceš, aby ti nette zasahovalo (rozvinulo do nějaké najoinované kolonky), tak ji obal do `.

Editoval Eda (28. 1. 2014 12:18)