2025-08-11 15:07:36 +03:00

181 lines
7.7 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 goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
use goodboyalex\php_db_components_pack\enums\DBOperation;
use PDO;
/**
* Трейт для работы с получением данных из базы данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
* @see PDO
*/
trait DatabaseGet
{
/**
* Извлекает одну запись из базы данных и создает соответствующий объект класса.
*
* @param string $table Название таблицы.
* @param array $columns Колонки, которые нужно включить в запрос.
* @param ConditionBuilder $where Условия выборки.
* @param string $className Полное имя класса, реализуемого интерфейсом IDBItem.
*
* @return object|false Заполненный объект класса или <code>false</code> в случае ошибки.
*/
public function GetRow (string $table, array $columns = [], ConditionBuilder $where = new ConditionBuilder(),
string $className = "\\StdClass"): object|false
{
// Задаю массив параметров
$params = [];
// Формируем SQL-запрос
$sql = $this->PrepareSQLForRowsQuery($table, $columns, $where, $params);
// Добавляю лимит
$sql .= " LIMIT 1";
// Получаю строку
$row = $this->Query($sql, $params);
// Если не получено
if ($row === false)
// - то вывожу false
return false;
// Получаю объект
$item = $this->RestoreItem($row, $className, DBOperation::Get);
// Если при получении возникла ошибка
if ($item === null)
// - то возвращаю false
return false;
// Возвращаю элемент
return $item;
}
/**
* Получает набор строк в массиве данных, удовлетворяющий выборке.
*
* @param string $table Имя таблицы.
* @param array $columns Колонки, которые нужно включить в запрос.
* @param ConditionBuilder $where Where-условия выборки.
* @param string $className Полное имя класса, реализуемого интерфейсом IDBItem.
*
* @return false|ObjectArray Массив найденных классов или <code>false</code> в случае ошибки.
*/
public function GetRows (string $table, array $columns = [], ConditionBuilder $where = new ConditionBuilder(),
string $className = "\\StdClass"): false|ObjectArray
{
// Задаю массив параметров
$params = [];
// Получаю SQL запрос
$sql = $this->PrepareSQLForRowsQuery($table, $columns, $where, $params);
// Получаю строки на основании запроса
$queryResult = $this->Query($sql, $params);
// Если строки не получены
if ($queryResult === false)
// - то выдаю ошибку
return false;
// Создаю массив объектов
$result = new ObjectArray();
// Для каждого элемента
foreach ($queryResult as $row) {
// - пытаюсь восстановить объект
$item = $this->RestoreItem($row, $className, DBOperation::Get);
// - если не получилось
if ($item === null)
// -- то пропускаю элемент
continue;
// - добавляю элемент в массив
$result[] = $item;
}
// Выдаю массив объектов
return $result;
}
/**
* Получает колонку в массиве данных.
*
* @param string $table Имя таблицы.
* @param string $column Имя колонки.
* @param ConditionBuilder $where Параметры запроса.
*
* @return false|array Ассоциированный массив с результатом запроса или false в случае ошибки.
*
* @see Query
*/
public function GetCol (string $table, string $column, ConditionBuilder $where = new ConditionBuilder()):
false|array
{
/**
* Интерпретирую условия.
*
* @var string $sql_where Строка запроса.
* @var array $params Массив параметров строки запроса.
*/
[$sql_where, $params] = $where->Build();
// Создаю запрос
$sql = "SELECT $this->DBSignOpen$column$this->DBSignClose FROM $this->DBSignOpen$table$this->DBSignClose";
// Если заданы where-параметры
if ($where->Count() > 0)
// - то добавляю их
$sql .= " WHERE $sql_where";
// Получаю столбец на основании запроса
$queryResult = $this->Query($sql, $params);
// Если строка не получена или пуста
if ($queryResult === false)
// - то выдаю ошибку
return false;
// Создаю результат
$result = [];
// Для каждого результата запроса
foreach ($queryResult as $row)
// - передаю его в результат
$result[] = $row[$column];
// Вывожу результат
return $result;
}
/**
* Получение значение единичного поля.
*
* @param string $table Имя таблицы.
* @param string $column Требуемый столбец.
* @param ConditionBuilder $where Параметры запроса.
*
* @return mixed|null Результат запроса или <code>null</code> в случае ошибки.
*/
public function GetValue (string $table, string $column, ConditionBuilder $where): mixed
{
// Получаю колонку по условию из таблицы
$result = $this->GetCol($table, $column, $where);
// Если результат получен, то выдаю первый элемент, а если нет, то null
return $result[0] ?? null;
}
}