/** * @param Metadata $metadata * @param $query * @param array $bind * @param Connection $db */ public function __construct(Metadata $metadata, $query, array $bind = null, Connection $db = null) { $this->metadata = $metadata; if (null !== $db) { $this->db = $db; } else { $this->db = $metadata->getDbConnection(); } $selectAllFields = []; $dbCols = $this->metadata->getDbColNames(); foreach ($dbCols as $colName) { $selectAllFields[] = 't.' . $this->qi($colName); } $query = str_ireplace(['select *', ':t'], ['SELECT ' . implode(', ', $selectAllFields), $this->qi($this->metadata->getDbTableName()) . ' t'], $query); // auto replace :field_name placeholders by their quoted db column names $query = preg_replace_callback('/:(\\w+)/', function ($matches) use($metadata) { if ($metadata->__isset($matches[1])) { return $this->qi($metadata->getField($matches[1])->db_column); } else { return $matches[0]; } }, $query); $this->queryStringCache = $query; // other :somename placeholders treated as prepared statement bindings if (null !== $bind) { $this->bind($bind); } $this->returnObjects(); }
/** * @return array */ public function validate() { foreach ($this->data as $key => $value) { $field = $this->metadata->getField($key); try { $field->validate($value); } catch (ValidationError $e) { $this->addValidationError($field->name, $e->getMessages()); } catch (\Exception $e) { $this->addValidationError($field->name, $e->getMessage()); $prev = $e; while ($prev = $prev->getPrevious()) { $this->addValidationError($field->name, $prev->getMessage()); } } } return $this->validationErrors; }