/** * 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 ''; }
/** * Build the DELETE query. * * @param \Titon\Db\Query $query * @return string */ public function buildDelete(Query $query) { return $this->renderStatement(Query::DELETE, ['table' => $this->formatTable($query->getTable(), $query->getAlias()), 'joins' => $this->formatJoins($query->getJoins()), 'where' => $this->formatWhere($query->getWhere()), 'orderBy' => $this->formatOrderBy($query->getOrderBy()), 'limit' => $this->formatLimit($query->getLimit())] + $this->formatAttributes($query->getAttributes())); }