Passed
Push — master ( 6a2bcc...90a2e4 )
by Juan
09:59
created

NativeQueryBuilder::getResultFromConnection()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
c 0
b 0
f 0
nc 2
nop 3
dl 0
loc 13
rs 10
1
<?php
2
3
namespace Micayael\NativeQueryFromFileBuilderBundle\Service;
4
5
use Doctrine\DBAL\Result;
6
use Doctrine\ORM\EntityManagerInterface;
7
use Doctrine\ORM\NonUniqueResultException;
8
use Doctrine\ORM\NoResultException;
9
use Doctrine\ORM\Query\ResultSetMappingBuilder;
10
use Doctrine\Persistence\ManagerRegistry;
11
use Micayael\NativeQueryFromFileBuilderBundle\Helper\NativeQueryBuilderHelper;
12
use Symfony\Component\Cache\Adapter\AdapterInterface;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
15
class NativeQueryBuilder implements NativeQueryBuilderInterface
16
{
17
    /**
18
     * @var EntityManagerInterface
19
     */
20
    private $em;
21
22
    /**
23
     * @var ManagerRegistry
24
     */
25
    private $doctrine;
26
27
    /**
28
     * @var EventDispatcherInterface|null
29
     */
30
    private $eventDispatcher;
31
32
    /**
33
     * @var AdapterInterface|null
34
     */
35
    private $cache;
36
37
    private $helper;
38
39
    private $bundleConfig;
40
41
    public function __construct(EntityManagerInterface $em, ManagerRegistry $doctrine, ?EventDispatcherInterface $eventDispatcher, ?AdapterInterface $cache, array $bundleConfig)
42
    {
43
        $this->em = $em;
44
        $this->doctrine = $doctrine;
45
        $this->eventDispatcher = $eventDispatcher;
46
        $this->cache = $cache;
47
        $this->bundleConfig = $bundleConfig;
48
49
        $this->helper = new NativeQueryBuilderHelper($this->eventDispatcher, $this->cache, $bundleConfig);
50
    }
51
52
    public function changeEntityManager(EntityManagerInterface $em)
53
    {
54
        $this->em = $em;
55
    }
56
57
    public function findFromSqlKey(string $key, array $params = [], ?string $orderBy = null, string $connectionName = null, ResultSetMappingBuilder $rsm = null): array
58
    {
59
        if ($orderBy) {
60
            $params['orderby'] = $orderBy;
61
        }
62
63
        $sql = $this->helper->getSqlFromYamlKey($key, $params);
64
65
        if ($rsm) {
66
            $nativeQuery = $this->em
67
                ->createNativeQuery($sql, $rsm)
68
            ;
69
70
            foreach ($params as $key => $value) {
71
                $nativeQuery->setParameter($key, $value);
72
            }
73
74
            $ret = $nativeQuery->getResult();
75
        } else {
76
            $result = $this->getResultFromConnection($connectionName, $sql, $params);
77
78
            $ret = $result->fetchAllAssociative();
79
        }
80
81
        return $ret;
82
    }
83
84
    public function findOneFromSqlKey(string $key, array $params = [], string $connectionName = null, ResultSetMappingBuilder $rsm = null): array
85
    {
86
        try {
87
            $sql = $this->helper->getSqlFromYamlKey($key, $params);
88
89
            $ret = [];
90
91
            if ($rsm) {
92
                $nativeQuery = $this->em
93
                    ->createNativeQuery($sql, $rsm);
94
95
                foreach ($params as $key => $value) {
96
                    $nativeQuery->setParameter($key, $value);
97
                }
98
99
                $ret[] = $nativeQuery->getSingleResult();
100
            } else {
101
                $result = $this->getResultFromConnection($connectionName, $sql, $params);
102
103
                $ret = $result->fetchAssociative();
104
            }
105
106
            if (empty($ret)) {
107
                return [];
108
            }
109
110
            return $ret;
111
        } catch (NoResultException $e) {
112
            return [];
113
        }
114
    }
115
116
    public function findScalarFromSqlKey(string $key, array $params = [], string $connectionName = null): mixed
117
    {
118
        $sql = $this->helper->getSqlFromYamlKey($key, $params);
119
120
        $result = $this->getResultFromConnection($connectionName, $sql, $params);
121
122
        $ret = $result->fetchOne();
123
124
        return $ret;
125
    }
126
127
    private function getResultFromConnection(?string $connectionName, string $sql, array $params = []): Result
128
    {
129
        $conn = $this->doctrine->getConnection($connectionName ?: $this->bundleConfig['default_connection']);
130
131
        $stmt = $conn->prepare($sql);
132
133
        foreach ($params as $key => $value) {
134
            $stmt->bindValue($key, $value);
135
        }
136
137
        $ret = $stmt->executeQuery();
138
139
        return $ret;
140
    }
141
}
142