Nefunkční update z parametrizovaného selectu – chyba „There are more parameters than placeholders.“
- kyblsoft
- Člen | 2
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
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
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
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#…