20250729
This commit is contained in:
153
sources/traits/Database/DatabaseInsert.php
Normal file
153
sources/traits/Database/DatabaseInsert.php
Normal file
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @noinspection SqlNoDataSourceInspection
|
||||
*/
|
||||
|
||||
namespace goodboyalex\php_db_components_pack\traits\Database;
|
||||
|
||||
use Exception;
|
||||
use goodboyalex\php_components_pack\classes\Tuple;
|
||||
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
|
||||
use PDO;
|
||||
use PDOException;
|
||||
|
||||
/**
|
||||
* Трейт для работы со вставкой строк в базу данных.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
* @see PDO
|
||||
*/
|
||||
trait DatabaseInsert
|
||||
{
|
||||
/**
|
||||
* Вставляет строку в базу данных.
|
||||
*
|
||||
* @param string $table Имя таблицы.
|
||||
* @param IDBItem $row Модель или класс, реализующий интерфейс IDBItem, для вставки.
|
||||
* @param array $options Массив дополнительных параметров. Может содержать следующие ключи:
|
||||
*
|
||||
* - <code>ignore: array</code> - игнорировать перечисленные поля. Когда массив пуст, то ничего
|
||||
* игнорироваться не будет. По умолчанию - пустой массив.
|
||||
* - <code>allow: array</code> - включать только перечисленные поля. Когда массив пуст, то все поля будут
|
||||
* включены. По умолчанию - пустой массив.
|
||||
*
|
||||
* @return string|false В случае успеха выведет: id созданной записи, -1, если запись создана, но id не получен
|
||||
* (глюк?) и false, если ошибка
|
||||
*/
|
||||
public function Insert (string $table, IDBItem $row, array $options = []): string|false
|
||||
{
|
||||
// Подготавливаю запрос
|
||||
[$sql, $params] = $this->PrepareInsertSQL($table, $row, $options);
|
||||
|
||||
// Выполняю запрос
|
||||
$count = $this->Execute($sql, $params);
|
||||
|
||||
// Если результат - false или добавлена не одна запись
|
||||
if (($count === false) || ($count < 1) || ($count > 1))
|
||||
// - то и общий результат - false
|
||||
return false;
|
||||
|
||||
$lastId = -1;
|
||||
|
||||
try {
|
||||
// Получаю последний id этой записи
|
||||
$lastIdResult = $this->DataBaseHandle->lastInsertId();
|
||||
|
||||
// Если получение неудачное
|
||||
if ($lastIdResult === false)
|
||||
// - то вывожу -1
|
||||
return $lastId;
|
||||
|
||||
// Устанавливаю последний id
|
||||
$lastId = $lastIdResult;
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this->HandleException($e);
|
||||
}
|
||||
|
||||
// Вывожу последний id
|
||||
return $lastId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Вставляет несколько строк в базу данных.
|
||||
*
|
||||
* @param string $table Имя таблицы.
|
||||
* @param array $options Параметры.
|
||||
* @param IDBItem ...$sources Модели или классы, реализующие интерфейс IDBItem, для вставки.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function InsertMany (string $table, array $options, IDBItem ...$sources): void
|
||||
{
|
||||
// Инициализирую транзакцию
|
||||
$this->InitTransaction();
|
||||
|
||||
try {
|
||||
|
||||
// Для каждого источника
|
||||
foreach ($sources as $source)
|
||||
// - вставляю строку
|
||||
$this->Insert($table, $source, $options);
|
||||
|
||||
// Если вставка успешна, то подтверждаю транзакцию
|
||||
$this->Commit();
|
||||
}
|
||||
catch (Exception $exception) {
|
||||
// - если ошибка, то откатываю транзакцию
|
||||
$this->RollBack();
|
||||
|
||||
// - и вывожу ошибку
|
||||
$this->HandleException($exception);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Подготавливает запрос для вставки строки в базу данных.
|
||||
*
|
||||
* @param string $table Имя таблицы.
|
||||
* @param IDBItem $row Элемент.
|
||||
* @param array $options Параметры.
|
||||
*
|
||||
* @return Tuple Возвращает [запрос, параметры запроса].
|
||||
*/
|
||||
private function PrepareInsertSQL (string $table, IDBItem $row, array $options = []): Tuple
|
||||
{
|
||||
// Подготавливаю массив параметров
|
||||
$params = $this->PrepareParamsArray(source: $row, options: $options);
|
||||
|
||||
// Получаю ключи параметров
|
||||
$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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user