| | <?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()'; |
| | } |
| |
|
| | } |
| |
|