/** * Second step. Create where conditions in Doctrine style. This * method groups the subfields together: * e.g.: a[0]=1, b[0]=2, a[1]=2, b[1]=5 => (a=1 and b=2) OR (a=2 and b=5) * This is needed for custom vars or any other multifield confitions * @param Doctrine_Collection $values * @param Doctrine_Query_Abstract $query * @param unknown_type $alias */ private function createConditions(Doctrine_Collection $values, Doctrine_Query_Abstract $query, $alias) { $arrayStatements = array(); $arrayValues = array(); foreach ($values as $value) { $k = $value->tv_key; $v = $value->tv_val; if (!array_key_exists($k, $this->fields)) { continue; } if (!array_key_exists($k, $arrayStatements)) { $arrayStatements[$k] = array(); } if (!array_key_exists($k, $arrayValues)) { $arrayValues[$k] = array(); } $arrayStatements[$k][] = sprintf('%s.%s=?', $alias, $this->fields[$k]); $arrayValues[$k][] = $v; } $stateOut = array(); $stateVal = array(); while (true) { $stmtTmp = array(); foreach ($this->fields as $fid => $fname) { if (count($arrayStatements[$fid]) && count($arrayValues[$fid])) { $stmtTmp[] = array_shift($arrayStatements[$fid]); $stateVal[] = array_shift($arrayValues[$fid]); } else { break 2; } } $stateOut[] = '(' . implode(' and ', $stmtTmp) . ')'; } $statement = implode(' OR ', $stateOut); $query->andWhere($statement, $stateVal); }