148 lines
5.8 KiB
PHP
148 lines
5.8 KiB
PHP
<?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\enums\DBOperation;
|
||
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, для вставки.
|
||
*
|
||
* @return mixed В случае успеха выведет: id созданной записи, -1, если запись создана, но id не получен
|
||
* (глюк?) и false, если ошибка
|
||
*/
|
||
public function Insert (string $table, IDBItem $row): mixed
|
||
{
|
||
// Подготавливаю запрос
|
||
[$sql, $params] = $this->PrepareInsertSQL($table, $row);
|
||
|
||
// Выполняю запрос
|
||
$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): 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);
|
||
}
|
||
} |