Created
September 10, 2024 05:01
-
-
Save POMXARK/069758913fa6855008381d2da31459b5 to your computer and use it in GitHub Desktop.
symfony DQL Doctrine - Преобразует QueryBuilder в сырой SQL-запрос.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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