| <?php |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| namespace think\db\builder; |
|
|
| use think\db\Builder; |
| use think\Exception; |
|
|
| |
| |
| |
| class Mysql extends Builder |
| { |
|
|
| protected $insertAllSql = '%INSERT% INTO %TABLE% (%FIELD%) VALUES %DATA% %COMMENT%'; |
| protected $updateSql = 'UPDATE %TABLE% %JOIN% SET %SET% %WHERE% %ORDER%%LIMIT% %LOCK%%COMMENT%'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function insertAll($dataSet, $options = [], $replace = false) |
| { |
| |
| if ('*' == $options['field']) { |
| $fields = array_keys($this->query->getFieldsType($options['table'])); |
| } else { |
| $fields = $options['field']; |
| } |
|
|
| foreach ($dataSet as $data) { |
| foreach ($data as $key => $val) { |
| if (!in_array($key, $fields, true)) { |
| if ($options['strict']) { |
| throw new Exception('fields not exists:[' . $key . ']'); |
| } |
| unset($data[$key]); |
| } elseif (is_null($val)) { |
| $data[$key] = 'NULL'; |
| } elseif (is_scalar($val)) { |
| $data[$key] = $this->parseValue($val, $key); |
| } elseif (is_object($val) && method_exists($val, '__toString')) { |
| |
| $data[$key] = $val->__toString(); |
| } else { |
| |
| unset($data[$key]); |
| } |
| } |
| $value = array_values($data); |
| $values[] = '( ' . implode(',', $value) . ' )'; |
|
|
| if (!isset($insertFields)) { |
| $insertFields = array_map([$this, 'parseKey'], array_keys($data)); |
| } |
| } |
|
|
| return str_replace( |
| ['%INSERT%', '%TABLE%', '%FIELD%', '%DATA%', '%COMMENT%'], |
| [ |
| $replace ? 'REPLACE' : 'INSERT', |
| $this->parseTable($options['table'], $options), |
| implode(' , ', $insertFields), |
| implode(' , ', $values), |
| $this->parseComment($options['comment']), |
| ], $this->insertAllSql); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| protected function parseKey($key, $options = [], $strict = false) |
| { |
| if (is_numeric($key)) { |
| return $key; |
| } elseif ($key instanceof Expression) { |
| return $key->getValue(); |
| } |
|
|
| $key = trim($key); |
| if (strpos($key, '$.') && false === strpos($key, '(')) { |
| |
| list($field, $name) = explode('$.', $key); |
| return 'json_extract(' . $field . ', \'$.' . $name . '\')'; |
| } elseif (strpos($key, '.') && !preg_match('/[,\'\"\(\)`\s]/', $key)) { |
| list($table, $key) = explode('.', $key, 2); |
| if ('__TABLE__' == $table) { |
| $table = $this->query->getTable(); |
| } |
| if (isset($options['alias'][$table])) { |
| $table = $options['alias'][$table]; |
| } |
| } |
|
|
| if ($strict && !preg_match('/^[\w\.\*]+$/', $key)) { |
| throw new Exception('not support data:' . $key); |
| } |
| if ('*' != $key && ($strict || !preg_match('/[,\'\"\*\(\)`.\s]/', $key))) { |
| $key = '`' . $key . '`'; |
| } |
| if (isset($table)) { |
| if (strpos($table, '.')) { |
| $table = str_replace('.', '`.`', $table); |
| } |
| $key = '`' . $table . '`.' . $key; |
| } |
| return $key; |
| } |
|
|
| |
| |
| |
| |
| |
| protected function parseRand() |
| { |
| return 'rand()'; |
| } |
|
|
| } |
|
|