This commit is contained in:
2025-07-29 17:50:57 +03:00
parent e4c8d7e6c8
commit 8436569ce5
9 changed files with 1223 additions and 839 deletions

View 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);
}
}