Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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 '';
 }