Jak správně zapsat podmínku s WhereOr?
- Allconius
- Člen | 317
Ahoj, jak mám správně zapsat podmínku pomocí WhereOr ? Našel jsem že by to měla být tato syntaxe:
$table->whereOr(
'id > ?' => 12,
'ROUND(id, ?) = ?' => [5, 3],
]);
ale když jsem to zkusil tak mi to vypisuje „syntax error, unexpected ‚=>‘ (T_DOUBLE_ARROW), expecting ‚)‘“:
$result = $this->database->table($this->tabulkaseznam)
->where(''.$this->tabulkaseznam.'.EVIDENCE = ?', 1)
->where(''.$this->tabulkaseznam.'.VZNIK_PPV1 <= ?', $date)
->whereOr(''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?' => $misto, ''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?' => 'tajemník%')
->order(''.$this->tabulkaseznam.'.PRIJMENI ASC');
Co tam mám špatně ?
- Allconius
- Člen | 317
tohle mi už prošlo:
$whereor = [''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?'=> '%vedoucí%', ''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?'=> 'tajemník%'];
$result = $this->database->table($this->tabulkaseznam)
->where(''.$this->tabulkaseznam.'.EVIDENCE = ?', 1)
->where(''.$this->tabulkaseznam.'.VZNIK_PPV1 <= ?', $date)
->whereOr($whereor)
->order(''.$this->tabulkaseznam.'.PRIJMENI ASC');
ale udělalo to jen:
SELECT ID_ZAMESTNANCE
FROM `telefonniseznam`
WHERE (`telefonniseznam`.EVIDENCE = 1) AND (`telefonniseznam`.VZNIK_PPV1 <= '20190930') AND
(`telefonniseznam`.MISTO_NAZEV LIKE 'tajemník%')
ORDER BY `telefonniseznam`.PRIJMENI ASC
potřeboval bych aby to dělalo:
SELECT ID_ZAMESTNANCE
FROM `telefonniseznam`
WHERE (`telefonniseznam`.EVIDENCE = 1) AND (`telefonniseznam`.VZNIK_PPV1 <= '20190930') AND
((`telefonniseznam`.MISTO_NAZEV LIKE 'vedoucí%') OR (`telefonniseznam`.MISTO_NAZEV LIKE 'tajemník%') )
ORDER BY `telefonniseznam`.PRIJMENI ASC
- Tomáš Vodička
- Člen | 28
V tom $whereor poli máš dvakrát stejný klíč, přepíšeš si tu první hodnotu
něco takového by mělo fungovat
...
->where($this->tabulkaseznam.'.MISTO_NAZEV LIKE ? OR '.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?', '%vedoucí%', 'tajemník%')
...
- Allconius
- Člen | 317
Tomáš Vodička napsal(a):
V tom $whereor poli máš dvakrát stejný klíč, přepíšeš si tu první hodnotu
něco takového by mělo fungovat
... ->where($this->tabulkaseznam.'.MISTO_NAZEV LIKE ? OR '.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?', '%vedoucí%', 'tajemník%') ...
Ahoj, vypsalo mi to toto:
Nette\InvalidArgumentException
Argument count does not match placeholder count.
- Allconius
- Člen | 317
Tady jsem našel tu funkci whereOr, zkusím to prozkoumat :-)
public function whereOr(array $parameters): static
{
if (count($parameters) < 2) {
return $this->where($parameters);
}
$columns = [];
$values = [];
foreach ($parameters as $key => $val) {
if (is_int($key)) { // whereOr(['full condition'])
$columns[] = $val;
} elseif (!str_contains($key, '?')) { // whereOr(['column1' => 1])
$columns[] = $key . ' ?';
$values[] = $val;
} else { // whereOr(['column1 > ?' => 1])
$qNumber = substr_count($key, '?');
if ($qNumber > 1 && (!is_array($val) || $qNumber !== count($val))) {
throw new Nette\InvalidArgumentException('Argument count does not match placeholder count.');
}
$columns[] = $key;
$values = array_merge($values, $qNumber > 1 ? $val : [$val]);
}
}
$columnsString = '(' . implode(') OR (', $columns) . ')';
return $this->where($columnsString, $values);
}
- IJVo
- Člen | 39
Allconius napsal(a):
Zapomněl jsem oddělat ty [], proto to psalo když to dám jen takto:
$whereor = ''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ? OR '.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?', '%vedoucí%', 'tajemník%';
tak to vypisuje chybnou čárku …
ParseError syntax error, unexpected ','
Nemůžeš tři parametry vkládat do jedné proměnné $whereor.
Vlož to přímo do té funkce a bude to fungovat.
- Allconius
- Člen | 317
hmm, tak je to tak jak psal Tomáš Vodička, to whereOr se nedá použít v případě že se jedná o stejné pole, protože se přepíše ten klíč, pokud jsem změnil název tak to prošlo:
SELECT *
FROM `telefonniseznam`
WHERE (`telefonniseznam`.EVIDENCE = 1) AND (`telefonniseznam`.VZNIK_PPV1 <= '20190930') AND
((`telefonniseznam`.MISTO_NAZEV1 LIKE 'tajemník%') OR (`telefonniseznam`.MISTO_NAZEV LIKE '%vedoucí%'))
ORDER BY `telefonniseznam`.PRIJMENI ASC
takže jediná možnost sešmudlit to přes to where()
- Allconius
- Člen | 317
IJVo napsal(a):
Allconius napsal(a):
Zapomněl jsem oddělat ty [], proto to psalo když to dám jen takto:
$whereor = ''.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ? OR '.$this->tabulkaseznam.'.MISTO_NAZEV LIKE ?', '%vedoucí%', 'tajemník%';
tak to vypisuje chybnou čárku …
ParseError syntax error, unexpected ','
Nemůžeš tři parametry vkládat do jedné proměnné $whereor.
Vlož to přímo do té funkce a bude to fungovat.
Ano, je to tak, funguje díky :-)