Как использовать массив PHP в качестве параметра в хранимой процедуре postgresql с использованием доктрины? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь использовать массив php в качестве параметра хранимой процедуры в моем приложении Symfony.

Но я не могу найти ничего такого в учении.

У меня есть хранимая процедура в моей базе данных postgresql, принимающая в качестве параметров два массива:

CREATE OR REPLACE FUNCTION myschema."deleteHashes" (
  additions text [],
  deletions integer []
)

Очень просто вызвать его в SQL-запросе, например:

select "deleteHashes"(ARRAY['foo', 'bar'], ARRAY[1, 2, 3]);

Использование констант PARAM_STR_ARRAY и PARAM_INT_ARRAY в доктрине при построении запроса разбивает массивы, и это не то, что мне нужно:

        $sql = 'select "deleteHashes"(:additions , :deletions)';
        $this->getEntityManager()->getConnection()->executeQuery(
            $sql,
            [
                'additions' => $additions,
                'deletions' => $deletions,
            ],
            [
                'additions' => Connection::PARAM_STR_ARRAY,
                'deletions' => Connection::PARAM_INT_ARRAY,
            ]
        );

У меня есть рабочее решение, если я генерирую полную строку SQL в php:

        $sql = 'select "deleteHashes"('.
            $this->arrayToSql($additions, self::STR).', '.
            $this->arrayToSql($deletions, self::INT).")";
private function arrayToSql($stringArray, $type)
    {
        $returnString = 'ARRAY[';

        if ($type === self::STR) {
            $stringArray = array_map(function ($data) {
                return "'".$data."'";
            }, $stringArray);
        }

        $returnString = $returnString . implode(', ', $stringArray);
        return $returnString.']';
    }

Работает нормально, но, на мой взгляд, не очень элегантно.

Как я могу отправить свой массив в доктрину хранимых процедур?

...