2025-07-29 17:50:57 +03:00

153 lines
6.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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