/** * @param SQLInsert $query * @param array $parameters * @return string */ protected function buildInsertQuery(SQLInsert $query, array &$parameters) { // Multi-row insert requires SQLite specific syntax prior to 3.7.11 // For backwards compatibility reasons include the "union all select" syntax $nl = $this->getSeparator(); $into = $query->getInto(); // Column identifiers $columns = $query->getColumns(); // Build all rows $rowParts = array(); foreach ($query->getRows() as $row) { // Build all columns in this row $assignments = $row->getAssignments(); // Join SET components together, considering parameters $parts = array(); foreach ($columns as $column) { // Check if this column has a value for this row if (isset($assignments[$column])) { // Assigment is a single item array, expand with a loop here foreach ($assignments[$column] as $assignmentSQL => $assignmentParameters) { $parts[] = $assignmentSQL; $parameters = array_merge($parameters, $assignmentParameters); break; } } else { // This row is missing a value for a column used by another row $parts[] = '?'; $parameters[] = null; } } $rowParts[] = implode(', ', $parts); } $columnSQL = implode(', ', $columns); $sql = "INSERT INTO {$into}{$nl}({$columnSQL}){$nl}SELECT " . implode("{$nl}UNION ALL SELECT ", $rowParts); return $sql; }
/** * Builds a query from a SQLInsert expression * * @param SQLInsert $query The expression object to build from * @param array $parameters Out parameter for the resulting query parameters * @return string Completed SQL string */ protected function buildInsertQuery(SQLInsert $query, array &$parameters) { $nl = $this->getSeparator(); $into = $query->getInto(); // Column identifiers $columns = $query->getColumns(); $sql = "INSERT INTO {$into}{$nl}(" . implode(', ', $columns) . ")"; // Values $sql .= "{$nl}VALUES"; // Build all rows $rowParts = array(); foreach ($query->getRows() as $row) { // Build all columns in this row $assignments = $row->getAssignments(); // Join SET components together, considering parameters $parts = array(); foreach ($columns as $column) { // Check if this column has a value for this row if (isset($assignments[$column])) { // Assigment is a single item array, expand with a loop here foreach ($assignments[$column] as $assignmentSQL => $assignmentParameters) { $parts[] = $assignmentSQL; $parameters = array_merge($parameters, $assignmentParameters); break; } } else { // This row is missing a value for a column used by another row $parts[] = '?'; $parameters[] = null; } } $rowParts[] = '(' . implode(', ', $parts) . ')'; } $sql .= $nl . implode(",{$nl}", $rowParts); return $sql; }