Jak přidat OR do cyklu s WHERE

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

Ahoj,
mám foreach cyklus, kde se postupně přidávají podmínky a v případě opakování potřebuji na začátek přidat ještě OR.
Příklad:

$a = 1;
$b = array(1, 2, '', 3, '', '', 4, 5);
$c = 3;	// může a nemusí být
$i = 0;

foreach ($b as $bb) {
	if ($i > 0) {
	// přídání OR
	}
	$selection->where('a', $a);
	if ($bb) {
	$selection->where('b', $bb);
	}
	if ($c) {
	$selection->where('c', $c);
	}
	$i++;
}

A výsledek by měl vypadat takto:
SELECT xy FROM yz WHERE a=1 AND b=1 AND c=3 OR a=1 AND b=2 AND c=3 OR

japlavaren
Člen | 404
+
0
-

Ak to chápem správne, postačí tu dotaz:

SELECT xy FROM yz WHERE a=1 AND b IN(1,2,3,4,5) AND c=3
<?php
$selection->where('a', $a);

if($bb = array_filter($b)){
	$selection->where('b', $bb);
}

if($c){
	$selection->where('c', $c);
}
?>

Editoval japlavaren (3. 12. 2014 20:34)

Karel_243
Člen | 9
+
0
-

Děkuji, ale omlouvám se, příklad jsem psal z hlavy a tak nebyl úplně přesný. Správně by to mělo být takto:

$a = array(array('aa'), array('ab'), array('ac'), array('ad'));
$b = array(1, 2, 3, 4, 5); // může a nemusí být
$i = 0;

foreach ($a as $key => $value) {
    if ($i > 0) {
    // přídání OR
    }
    $selection->where('value', $value);
    $selection->where('key', $key);
    if ($b) {
    $selection->where('b', $b);
    }
    $i++;
}
SELECT xz FROM yz WHERE value=aa AND key=1 AND b IN(1,2,3,4,5) OR value=ab AND key=2 AND b IN(1,2,3,4,5) OR...
greeny
Člen | 405
+
0
-
$selection->where('key1 = ? OR key2 = ?', $val1, $val2);

by mohlo být to co hledáš

Karel_243
Člen | 9
+
0
-

Někdo mi poradil použít multidimenzionální pole. S tím jsem se posunul dál, ale pokud pole b existuje, tak to skončí chybou. Teď se pokouším to pole nějak donutit, aby pracovalo s IN.

$a = array(array('aa'), array('ab'), array('ac'), array('ad'));
$b = array(1, 2, 3, 4, 5); // může a nemusí být
$i = 0;
$data = array();

foreach ($a as $key => $value) {
	$data[$i]['value'] = $value;
	$data[$i]['key'] = $key;
    if ($b) {
	$data[$i]['b'] = $b;
    }
    $i++;
}

if ($b) {
	$selection->where(array('value', 'key', 'b'), $data);
}
else {
	$selection->where(array('value', 'key'), $data);
}
Karel_243
Člen | 9
+
0
-

Kamarád mi poradil ještě předělat samotný dotaz, kde se podmínka pro pole b přidá zvlášt. Dotaz se chvá stejně a vše funguje jak má.

foreach ($a as $key => $value) {
    $data[$i]['value'] = $value;
    $data[$i]['key'] = $key;
    $i++;
}

if ($id_meny) {
	$selection->where('b', $b);
}
$selection->where(array('value', 'key'), $data);
SELECT xy FROM yz WHERE (b IN(1,2,3,4,5)) AND ((value=aa AND key=1) OR (value=ab AND key=2) OR...)

Děkuji všem za vaše nápady a za pomoc.