Skip to content

Instantly share code, notes, and snippets.

@POMXARK
Created September 10, 2024 05:01
Show Gist options
  • Save POMXARK/069758913fa6855008381d2da31459b5 to your computer and use it in GitHub Desktop.
Save POMXARK/069758913fa6855008381d2da31459b5 to your computer and use it in GitHub Desktop.
symfony DQL Doctrine - Преобразует QueryBuilder в сырой SQL-запрос.
<?php
namespace App\Helper;
use DateTimeImmutable;
use Doctrine\ORM\QueryBuilder;
class QueryBuilderToSql
{
/**
* Преобразует QueryBuilder в сырой SQL-запрос.
*
* @param QueryBuilder $queryBuilder
*
* @return string
*/
public static function getRawSql(QueryBuilder $queryBuilder): string
{
// Преобразуем QueryBuilder в Query
$query = $queryBuilder->getQuery();
// Получаем SQL-запрос
$sql = $query->getSQL();
// Получаем параметры
$parameters = $query->getParameters();
// Получаем список параметров
$parameterValues = [];
foreach ($parameters as $param) {
$parameterValues[] = self::getParameterValue($param->getValue());
}
// Заменяем ? в SQL-запросе на значения параметров
foreach ($parameterValues as $value) {
$sql = preg_replace('/\?/', $value, $sql, 1);
}
return $sql;
}
/**
* Преобразует значение параметра в строку для вставки в SQL.
*
* @param mixed $value
*
* @return string
*/
private static function getParameterValue(mixed $value): string
{
if ($value instanceof DateTimeImmutable) {
// Преобразуем DateTimeImmutable в строку в формате SQL
return "'".$value->format('Y-m-d H:i:s')."'";
} elseif (is_array($value)) {
// Преобразуем массив в строку
return self::formatArray($value);
} elseif (is_string($value)) {
return "'".self::escapeString($value)."'";
} elseif (is_null($value)) {
return 'NULL';
} elseif (is_bool($value)) {
return $value ? 'TRUE' : 'FALSE';
}
return (string) $value;
}
/**
* Преобразует массив в строку для вставки в SQL.
*
* @param array $array
*
* @return string
*/
private static function formatArray(array $array): string
{
$formatted = array_map(function ($item) {
// Преобразуем каждый элемент массива в строку
return self::getParameterValue($item);
}, $array);
// Объединяем элементы массива в строку, разделённую запятыми
return implode(', ', $formatted);
}
/**
* Экранирует строку для использования в SQL-запросе.
*
* @param string $value
*
* @return string
*/
private static function escapeString(string $value): string
{
// Здесь можно использовать методы для экранирования строк, если это необходимо
// Например, экранирование одинарных кавычек
return str_replace("'", "''", $value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment