Jak přidat OR do cyklu s WHERE
- Karel_243
- Člen | 9
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
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
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...
- Karel_243
- Člen | 9
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
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.