Nefunkční update z parametrizovaného selectu – chyba „There are more parameters than placeholders.“

kyblsoft
Člen | 2
+
0
-

Potřebuji mít selection, kde je jeden sloupec parametrizován:
SELECT *,CASE WHEN section NOT IN (‚ticket‘,‚meeting‘) THEN project ELSE product END AS project_product FROM task

Do selectionu přidávám podmínky dle filtru a následně potřebuji mít možnost hromadné změny všech záznamů:

$selection = $this->database
->table(‚task‘)
->select(‚
,CASE WHEN section NOT IN (?,?) THEN project ELSE product END AS project_product‘,‚ticket‘,‚meeting‘)
->where(…);
//update vyvola vyjimku Nette\InvalidArgumentException:There are more parameters than placeholders.
$selection->update([$values->column=>$values->replace]);

Pokud upravím select tak, aby neobsahoval zástupné znaky ‚?‘, funguje hromadný update dobře, ale select dobře není:

$selection = $this->database
->table(‚task‘)
->select(‚
,CASE WHEN section NOT IN ('ticket‘,‚meeting‘) THEN project ELSE product END AS project_product')
->where(…);
//update funguje spravne, ale select neni dobre protoze hodnoty ticket a meeting jsou brany jako nazvy sloupcu: SELECT ,CASE WHEN section NOT IN (' ‚ticket‘ ‚,‘ ‚meeting‘ ') THEN project ELSE product END AS project_product FROM task
$selection->update([$values->column=>$values->replace]);

Je chyba v Nette? Nebo můžu nějak napsat select tak, aby malá písmena nebral za názvy sloupců a neobaloval je apostrofy?

David Matějka
Moderator | 6445
+
0
-

ahoj, koukni jak formatovat kod

a k tvemu dotazu, zkus

$selection = $this->database
->table('task')
->select('CASE WHEN section NOT IN (?) THEN project ELSE product END AS project_product',['ticket','meeting'])
->where(...);
kyblsoft
Člen | 2
+
0
-

David Matějka napsal(a):

ahoj, koukni jak formatovat kod

a k tvemu dotazu, zkus

$selection = $this->database
->table('task')
->select('CASE WHEN section NOT IN (?) THEN project ELSE product END AS project_product',['ticket','meeting'])
->where(...);

Select funguje stejně dobře, ale update nefunguje ani při této úpravě dotazu. Prozatím jsem to obešel alespoň takto, ale dobrý pocit z toho nemám:
$selection = $this->database
->table(‚task‘)
->select(„*,CASE WHEN section NOT IN (LOWER(‚TICKET‘),LOWER(‚MEETING‘)) THEN project ELSE product END AS project_product“);

David Matějka
Moderator | 6445
+
0
-

no kdyz ted koukam na zdrojaky nette database, tak to vypada, ze je to opravdu bug. resenim by bylo ten select volat jen pokud opravdu tu selection sestavujes pro select a ne pro update…

a znovu te prosim, at se podivas na formatovani kodu: https://forum.nette.org/…v-tomto-foru#…