/** * Resolve the list of values that will be required for PDO statement binding. * * @param \Titon\Db\Query $query * @return array */ public function resolveParams(Query $query) { $params = []; $schema = $query->getRepository()->getSchema()->getColumns(); foreach ($query->getGroupedBindings() as $groupedBinds) { foreach ($groupedBinds as $binds) { $params[] = $this->resolveBind($binds['field'], $binds['value'], $schema); } } foreach ($query->getCompounds() as $compound) { $params = array_merge($params, $this->resolveParams($compound)); } return $params; }
/** * Format the fields structure depending on the type of query. * * @param \Titon\Db\Query $query * @return string * @throws \Titon\Db\Exception\InvalidQueryException */ public function formatFields(Query $query) { $joins = $query->getJoins(); $type = $query->getType(); switch ($type) { case Query::INSERT: case Query::MULTI_INSERT: $fields = $query->getData(); if (empty($fields)) { throw new InvalidQueryException('Missing field data for insert query'); } if ($type === Query::MULTI_INSERT) { $fields = $fields[0]; } return '(' . $this->quoteList(array_keys($fields)) . ')'; break; case Query::SELECT: $fields = $query->getFields(); if ($joins) { $columns = $this->formatSelectFields($fields, $query->getRepository()->getAlias()); foreach ($joins as $join) { $fields = $join->getFields(); if (empty($fields)) { throw new InvalidQueryException('Missing field data for join query'); } $columns = array_merge($columns, $this->formatSelectFields($fields, $join->getAlias())); } } else { $columns = $this->formatSelectFields($fields); } return implode(', ', $columns); break; case Query::UPDATE: $fields = $query->getData(); if (empty($fields)) { throw new InvalidQueryException('Missing field data for update query'); } if ($joins) { $values = $this->formatUpdateFields($fields, $query->getRepository()->getAlias()); foreach ($joins as $join) { $values = array_merge($values, $this->formatUpdateFields($join->getFields(), $join->getAlias())); } } else { $values = $this->formatUpdateFields($fields); } return implode(', ', $values); break; case Query::CREATE_INDEX: $fields = $query->getData(); $columns = []; foreach ($fields as $column => $data) { if (is_numeric($column)) { $column = $data; $data = []; } if (is_numeric($data)) { $data = ['length' => $data, 'order' => '', 'collate' => '']; } else { if (is_string($data)) { $data = ['length' => '', 'order' => $data, 'collate' => '']; } } $column = $this->quote($column); if (!empty($data['length'])) { $column .= sprintf($this->getClause(self::GROUP), $data['length']); } if (!empty($data['collate'])) { $column .= ' ' . sprintf($this->getClause(self::COLLATE), $data['collate']); } if (!empty($data['order'])) { $column .= ' ' . $this->getKeyword($data['order']); } $columns[] = $column; } return implode(', ', $columns); break; } return ''; }