Jak správně zapsat podmínku s WhereOr?

Allconius
Člen | 317
+
0
-

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
+
0
-

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
+
0
-

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
+
-1
-

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
+
0
-

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 ','

Allconius
Člen | 317
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 :-)