/** * Adds a specific field * * @param string $name * @param string $value * @param ApiInterface $entity * @param string $alias * * @return void */ private function addSearchField($name, $value, ApiInterface $entity, $alias) { $operator = "="; if (preg_match("/[<|>]\$/", $name)) { $operator = substr($name, -1) . "="; $name = substr($name, 0, -1); $fieldTypes = $entity->getFieldTypes(); $fieldTypesWhiteList = [ApiInterface::FIELD_TYPE_DATE, ApiInterface::FIELD_TYPE_DATE_TIME, ApiInterface::FIELD_TYPE_DOUBLE, ApiInterface::FIELD_TYPE_INT]; if (!in_array($fieldTypes[$name], $fieldTypesWhiteList)) { throw new Exception('Cannot perform ' . $operator . ' search on any fields that are not in ' . implode(", ", $fieldTypesWhiteList) . ': ' . $name . ' has a type of ' . $fieldTypes[$name], 400); } } $sql = $alias . '.' . $name; if (is_array($value)) { $attributes = []; foreach ($value as $subValue) { $entity->writeAttribute($name, $subValue); $attributes[] = $entity->readAttribute($name); } $this->getCriteria()->inWhere($sql, $attributes); } else { $entity->writeAttribute($name, $value); $attribute = $entity->readAttribute($name); $params = []; if (is_null($attribute)) { $sql .= " IS NULL"; } else { $attribute .= ''; //Make sure to convert to string, for Date and DateTime if (preg_match('@(^|[^\\\\])%@', $attribute)) { $operator = ' LIKE '; } $sql .= $operator . '?0'; $params[] = $attribute; } $this->getCriteriaHelper()->andWhere($sql, $params); } }