2.0.11 a změna v metodě where

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

Zdravím. Zkusím jsem upgrade na 2.0.11., ale jsem u drobného problému.
Mám takovouto situaci například:

->where("localityID = ?", array(0 =>2));

což už není povoleno v nové verzi a hlásí to chybu Column operator does not accept array argument.
Proč tomu tak je? To je BC? Jak to mám přepsat? Předem nevím kolik těch otazníků bude condition mít, což mi přijde jako elegantní předat jako druhý parametr pole.

Tomas Jancik
Člen | 103
+
0
-

a předat přímo jen pole nemůžeš?

->where(array('localityID' => 2, 'sloupec2' => 'neco'));

mělo by to vytvořit
WHERE localityID = 2 AND sloupec2 = 'neco'

hrach
Člen | 1838
+
0
-

K chybe: No samozrejme to mas spatne a nette te hlida, pokud chces, aby sloupec odpovidal vice hodnotam, tedy poli, pouzijes preci oprator IN.

->where("localityID IN ?", array(1, 2, 3, 4));
// funguje i
->where("localityID", array(1, 2, 3, 4));

K tomu, ze to driv fungovalo: srr, opravdu nezvladam filtrovat v hlave, co David do 2.0.x prenasi, co ne, a co muzes zpusobit vybirani jen nekterych commitu. Uz davno melo vyjit nette 2.1, ktery by melo sic. male bc breaky, ale kod je mnohem optimalizovanejsi a pro ndb odbugovanejsi…

ViPEr*CZ*
Člen | 817
+
0
-

Dobře, v pořádku. Dejme tomu, že to je BC break.
@Tomas Jancik: jako pole s klíči to předat nemůžeš, protože nevíš předem zda-li tam je operátor OR. To co píšeš ty přidá vždy AND.
@hrach: Tuhle syntax samozřejmě znám a využívám. Ale mému problému to nepomůže. Ve where může být více sloupců, podmínka AND i OR (což znemožní i vícenásobné použítí metody where). A samozřejmě předem to nevím. Vezmu hodnoty co pošle uživatel a sestavím řetězec s otazníky a v druhém parametru jsem předával pole, které dosadí hodnoty za otazníky.

hrach
Člen | 1838
+
0
-

V tom pripade si neschopny popsat svuj problem :P
Nejde delat:

->where('name ? OR id ?', array('jan', 2))

Udelej to pomoci

call_user_func_array([$selection, 'where'], array_merge(['name ? OR id ?'], $params));
ViPEr*CZ*
Člen | 817
+
0
-

Nebuď na mě zlej :-P Chvilku mi to trvá.
Jestli vůbec můžu, tak ten první zápis se mi líbí teda víc. Za tvůj zápis děkuji, je funkční.

hrach
Člen | 1838
+
0
-

Prvni zapis myslis co? :)

ViPEr*CZ*
Člen | 817
+
0
-

Myslím tento zápis ->where(‚name ? OR id ?‘, array(‚jan‘, 2))

hrach
Člen | 1838
+
0
-

A ten funguje?

David Matějka
Moderator | 6445
+
0
-

co tam dat podobnou moznost jako je v nette\database\connection – metody query a queryArgs? tak do selection dat where a whereArgs, kde by se v prvnim zadavaly parametry jako jednotlive argumenty a u whereArgs by vsechny parametry byly v poli v druhem argumentu funkce. pouziti call_user_func_array se mi moc nelibi :)

hrach
Člen | 1838
+
0
-

No, ono to vlastne fungovat bude, jen ten usecase pro sestavovani dynamickeho query bude o tom, ze musis
pri jednom parametru to nepredat jako pole.

ViPEr*CZ*
Člen | 817
+
0
-

hrach napsal(a):

A ten funguje?

Ten právě nefunguje. Aspoň teda ne, když je jen jeden parametr (1 otazník).

hrach napsal(a):

No, ono to vlastne fungovat bude, jen ten usecase pro sestavovani dynamickeho query bude o tom, ze
musis pri jednom parametru to nepredat jako pole.

To by právě bylo cool, kdyby to šlo bez ohledu na počet parametrů (souhlas s @matej21).

rixi
Člen | 109
+
0
-

hrach wrote:

->where('name ? OR id ?', array('jan', 2))

toto by islo pomocou bindovania parametrov

->where('name = :a OR id = :b', array('a' => 'jan', 'b' => 2))
hrach
Člen | 1838
+
0
-

To by právě bylo cool, kdyby to šlo bez ohledu na počet parametrů (souhlas s @matej21).

Toto chování se určitě měnit nebude, pač je naprosto logické. Problém je daný generickým sestavováním. Na to to stavěné není. Vzhledem k tomu, že je to možné řešit, nevidím duvod přidávat do api další metodu. Určitě si můžeš napsat jednoduše obsluhu pro toto chování…