/** * help $this->queryBuilder to construct a PHQL object * apply search rules based on the searchHelper conditions and return query * * @param \Phalcon\Mvc\Model\Query\BuilderInterface $query * @param string $modelNameSpace * @return \Phalcon\Mvc\Model\Query\BuilderInterface $query */ public function querySearcheHelper(\Phalcon\Mvc\Model\Query\BuilderInterface $query) { $searchFields = $this->searchHelper->getSearchFields(); if ($searchFields) { // preprocess the search fields to see if any of the search names require preprocessing // mostly just looking for || or type syntax otherwise process as default (and) WHERE clause $processedSearchFields = array(); foreach ($searchFields as $fieldName => $fieldValue) { $processedFieldName = $this->processSearchFields($fieldName); $processedFieldValue = $this->processSearchFields($fieldValue); $processedFieldQueryType = $this->processSearchFieldQueryType($processedFieldName, $processedFieldValue); $processedSearchFields[] = array('queryType' => $processedFieldQueryType, 'fieldName' => $processedFieldName, 'fieldValue' => $processedFieldValue); } foreach ($processedSearchFields as $processedSearchField) { switch ($processedSearchField['queryType']) { case 'and': $fieldName = $this->prependFieldNameNamespace($processedSearchField['fieldName']); $operator = $this->determineWhereOperator($processedSearchField['fieldValue']); $newFieldValue = $this->processFieldValue($processedSearchField['fieldValue'], $operator); $query->andWhere("{$fieldName} {$operator} \"{$newFieldValue}\""); break; case 'or': // make sure the field name is an array so we can use the same logic below for either circumstance if (!is_array($processedSearchField['fieldName'])) { $fieldNameArray = array($processedSearchField['fieldName']); } else { $fieldNameArray = $processedSearchField['fieldName']; } // make sure the field value is an array so we can use the same logic below for either circumstance if (!is_array($processedSearchField['fieldValue'])) { $fieldValueArray = array($processedSearchField['fieldValue']); } else { $fieldValueArray = $processedSearchField['fieldValue']; } foreach ($fieldNameArray as $fieldName) { $fieldName = $this->prependFieldNameNamespace($fieldName); foreach ($fieldValueArray as $fieldValue) { $operator = $this->determineWhereOperator($fieldValue); $newFieldValue = $this->processFieldValue($fieldValue, $operator); $query->orWhere("{$fieldName} {$operator} \"{$newFieldValue}\""); } } break; } } } return $query; }
/** * help $this->queryBuilder to construct a PHQL object * apply search rules based on the searchHelper conditions and return query * * @param \Phalcon\Mvc\Model\Query\BuilderInterface $query * @param string $modelNameSpace * @return \Phalcon\Mvc\Model\Query\BuilderInterface $query */ public function querySearcheHelper(\Phalcon\Mvc\Model\Query\BuilderInterface $query) { $searchFields = $this->searchHelper->getSearchFields(); if ($searchFields) { // pre-process the search fields to see if any of the search names require pre-processing // mostly just looking for || or type syntax otherwise process as default (and) WHERE clause $processedSearchFields = array(); foreach ($searchFields as $fieldName => $fieldValue) { $processed = $this->processFilterField($fieldName, $fieldValue, $query); if ($processed !== false) { $processedSearchFields[] = $processed; } } foreach ($processedSearchFields as $processedSearchField) { switch ($processedSearchField['queryType']) { case 'and': $fieldName = $this->prependFieldNameNamespace($processedSearchField['fieldName']); $operator = $this->determineWhereOperator($processedSearchField['fieldValue']); $newFieldValue = $this->processFieldValue($processedSearchField['fieldValue'], $operator); // $query->andWhere("$fieldName $operator \"$newFieldValue\""); if ($operator === 'IS NULL') { $query->andWhere("{$fieldName} {$operator}"); } else { $randomName = 'rand' . rand(1, 1000000); $query->andWhere("{$fieldName} {$operator} :{$randomName}:", array($randomName => $newFieldValue)); } break; case 'or': // format field name(s) is an array so we can use the same logic below for either circumstance if (!is_array($processedSearchField['fieldName'])) { $fieldNameArray = array($processedSearchField['fieldName']); } else { $fieldNameArray = $processedSearchField['fieldName']; } // format field value(s) is an array so we can use the same logic below for either circumstance if (!is_array($processedSearchField['fieldValue'])) { $fieldValueArray = array($processedSearchField['fieldValue']); } else { $fieldValueArray = $processedSearchField['fieldValue']; } // update to bind params instead of using string concatination $queryArr = []; $valueArr = []; $count = 1; foreach ($fieldNameArray as $fieldName) { $fieldName = $this->prependFieldNameNamespace($fieldName); foreach ($fieldValueArray as $fieldValue) { $marker = 'marker' . $count; $operator = $this->determineWhereOperator($fieldValue); $newFieldValue = $this->processFieldValue($fieldValue, $operator); if ($operator === 'IS NULL') { $queryArr[] = "{$fieldName} {$operator}"; } else { $queryArr[] = "{$fieldName} {$operator} :{$marker}:"; $valueArr[$marker] = $newFieldValue; } $count++; } } $sql = implode(' OR ', $queryArr); $query->andWhere($sql, $valueArr); break; } } } return $query; }