183 lines
7.7 KiB
PHP
183 lines
7.7 KiB
PHP
<?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;
|
||
}
|
||
} |