PrepareInsertSQL($table, $row); // Выполняю запрос $count = $this->Execute($sql, $params); // Если результат - false или добавлена не одна запись if (($count === false) || ($count < 1) || ($count > 1)) // - то и общий результат - false return false; // Задаю переменную для последнего id $lastId = match ($this->Config->Driver) { DBDriver::MSSQL => $this->DataBaseHandle->query('SELECT SCOPE_IDENTITY()')->fetchColumn(), DBDriver::MySQL, DBDriver::SQLite => $this->DataBaseHandle->lastInsertId(), DBDriver::PostgreSQL, DBDriver::OracleDB => $this->DataBaseHandle->lastInsertId('sequence_name') }; // Если id не получен if ($lastId === false) // - то вывожу просто true $lastId = true; // Вывожу последний id return $lastId; } /** * Вставляет несколько строк в базу данных. * * @param string $table Имя таблицы. * @param IDBItem ...$sources Модели или классы, реализующие интерфейс IDBItem, для вставки. * * @return false|array Возвращает массив id созданных записей и false, если ошибка. */ public function InsertMany (string $table, IDBItem ...$sources): false|array { // Инициализирую транзакцию $this->InitTransaction(); // Подготавливаю массив последних id $result = []; try { // Для каждого источника foreach ($sources as $source) // - вставляю строку $result[] = $this->Insert($table, $source); // Если вставка успешна, то подтверждаю транзакцию $this->Commit(); } catch (Exception) { // - если ошибка, то откатываю транзакцию $this->RollBack(); // - и вывожу ошибку return false; } // Вывожу результат return $result; } /** * Подготавливает запрос для вставки строки в базу данных. * * @param string $table Имя таблицы. * @param IDBItem $row Элемент. * * @return Tuple Возвращает [запрос, параметры запроса]. */ private function PrepareInsertSQL (string $table, IDBItem $row): Tuple { // Подготавливаю массив параметров $params = $this->PrepareParamsArray(source: $row, operation: DBOperation::Insert); // Получаю ключи параметров $keys = array_keys($params); // Создаю результирующий массив имён ключей параметров $keysReal = []; // Для каждого ключа параметра foreach ($keys as $key) { // - получаю его имя $keyResult = $key[0] == ":" ? substr($key, 1) : $key; // - заключаю в кавычки $keyResult = "$this->DBSignOpen$keyResult$this->DBSignClose"; // - добавляю в результирующий массив ключей $keysReal[] = $keyResult; } // Ключи sql запроса $sql_keys = implode(', ', $keysReal); // Значения sql запроса $sql_values = implode(', ', $keys); // Создаю запрос $sql = "INSERT INTO $this->DBSignOpen$table$this->DBSignClose ($sql_keys) VALUES ($sql_values);"; // Возвращаю результат return new Tuple($sql, $params); } }