@@ 33-239 (lines=207) @@ | ||
30 | * |
|
31 | * @description This class is deprecated since version 1.1 and will be removed in 2.0, use \Happyr\DoctrineSpecification\Repository\EntitySpecificationRepositoryTrait instead. |
|
32 | */ |
|
33 | trait EntitySpecificationRepositoryTrait |
|
34 | { |
|
35 | /** |
|
36 | * @var string alias |
|
37 | */ |
|
38 | private $alias = 'e'; |
|
39 | ||
40 | /** |
|
41 | * Get results when you match with a Specification. |
|
42 | * |
|
43 | * @param Filter|QueryModifier $specification |
|
44 | * @param ResultModifier|null $modifier |
|
45 | * |
|
46 | * @return mixed[] |
|
47 | */ |
|
48 | public function match($specification, ResultModifier $modifier = null) |
|
49 | { |
|
50 | $query = $this->getQuery($specification, $modifier); |
|
51 | ||
52 | return $query->execute(); |
|
53 | } |
|
54 | ||
55 | /** |
|
56 | * Get single result when you match with a Specification. |
|
57 | * |
|
58 | * @param Filter|QueryModifier $specification |
|
59 | * @param ResultModifier|null $modifier |
|
60 | * |
|
61 | * @throw Exception\NonUniqueException If more than one result is found |
|
62 | * @throw Exception\NoResultException If no results found |
|
63 | * |
|
64 | * @return mixed |
|
65 | */ |
|
66 | public function matchSingleResult($specification, ResultModifier $modifier = null) |
|
67 | { |
|
68 | $query = $this->getQuery($specification, $modifier); |
|
69 | ||
70 | try { |
|
71 | return $query->getSingleResult(); |
|
72 | } catch (DoctrineNonUniqueResultException $e) { |
|
73 | throw new NonUniqueResultException($e->getMessage(), $e->getCode(), $e); |
|
74 | } catch (DoctrineNoResultException $e) { |
|
75 | throw new NoResultException($e->getMessage(), $e->getCode(), $e); |
|
76 | } |
|
77 | } |
|
78 | ||
79 | /** |
|
80 | * Get single result or null when you match with a Specification. |
|
81 | * |
|
82 | * @param Filter|QueryModifier $specification |
|
83 | * @param ResultModifier|null $modifier |
|
84 | * |
|
85 | * @throw Exception\NonUniqueException If more than one result is found |
|
86 | * |
|
87 | * @return mixed|null |
|
88 | */ |
|
89 | public function matchOneOrNullResult($specification, ResultModifier $modifier = null) |
|
90 | { |
|
91 | try { |
|
92 | return $this->matchSingleResult($specification, $modifier); |
|
93 | } catch (NoResultException $e) { |
|
94 | return null; |
|
95 | } |
|
96 | } |
|
97 | ||
98 | /** |
|
99 | * Get single scalar result when you match with a Specification. |
|
100 | * |
|
101 | * @param Filter|QueryModifier $specification |
|
102 | * @param ResultModifier|null $modifier |
|
103 | * |
|
104 | * @throw Exception\NonUniqueException If more than one result is found |
|
105 | * @throw Exception\NoResultException If no results found |
|
106 | * |
|
107 | * @return mixed |
|
108 | */ |
|
109 | public function matchSingleScalarResult($specification, ResultModifier $modifier = null) |
|
110 | { |
|
111 | $query = $this->getQuery($specification, $modifier); |
|
112 | ||
113 | try { |
|
114 | return $query->getSingleScalarResult(); |
|
115 | } catch (DoctrineNonUniqueResultException $e) { |
|
116 | throw new NonUniqueResultException($e->getMessage(), $e->getCode(), $e); |
|
117 | } |
|
118 | } |
|
119 | ||
120 | /** |
|
121 | * Get scalar result when you match with a Specification. |
|
122 | * |
|
123 | * @param Filter|QueryModifier $specification |
|
124 | * @param ResultModifier|null $modifier |
|
125 | * |
|
126 | * @throw Exception\NonUniqueException If more than one result is found |
|
127 | * @throw Exception\NoResultException If no results found |
|
128 | * |
|
129 | * @return mixed |
|
130 | */ |
|
131 | public function matchScalarResult($specification, ResultModifier $modifier = null) |
|
132 | { |
|
133 | $query = $this->getQuery($specification, $modifier); |
|
134 | ||
135 | return $query->getScalarResult(); |
|
136 | } |
|
137 | ||
138 | /** |
|
139 | * Prepare a Query with a Specification. |
|
140 | * |
|
141 | * @param Filter|QueryModifier $specification |
|
142 | * @param ResultModifier|null $modifier |
|
143 | * |
|
144 | * @return Query |
|
145 | */ |
|
146 | public function getQuery($specification, ResultModifier $modifier = null) |
|
147 | { |
|
148 | $query = $this->getQueryBuilder($specification)->getQuery(); |
|
149 | ||
150 | if (null !== $modifier) { |
|
151 | $modifier->modify($query); |
|
152 | } |
|
153 | ||
154 | return $query; |
|
155 | } |
|
156 | ||
157 | /** |
|
158 | * @param Filter|QueryModifier $specification |
|
159 | * @param string|null $alias |
|
160 | * |
|
161 | * @return QueryBuilder |
|
162 | */ |
|
163 | public function getQueryBuilder($specification, $alias = null) |
|
164 | { |
|
165 | $qb = $this->createQueryBuilder($alias ?: $this->getAlias()); |
|
166 | $this->applySpecification($qb, $specification, $alias); |
|
167 | ||
168 | return $qb; |
|
169 | } |
|
170 | ||
171 | /** |
|
172 | * Iterate results when you match with a Specification. |
|
173 | * |
|
174 | * @param Filter|QueryModifier $specification |
|
175 | * @param ResultModifier|null $modifier |
|
176 | * |
|
177 | * @return \Traversable |
|
178 | */ |
|
179 | public function iterate($specification, ResultModifier $modifier = null) |
|
180 | { |
|
181 | foreach ($this->getQuery($specification, $modifier)->iterate() as $row) { |
|
182 | yield current($row); |
|
183 | } |
|
184 | } |
|
185 | ||
186 | /** |
|
187 | * @param string $alias |
|
188 | * |
|
189 | * @return $this |
|
190 | */ |
|
191 | public function setAlias($alias) |
|
192 | { |
|
193 | $this->alias = $alias; |
|
194 | ||
195 | return $this; |
|
196 | } |
|
197 | ||
198 | /** |
|
199 | * @return string |
|
200 | */ |
|
201 | public function getAlias() |
|
202 | { |
|
203 | return $this->alias; |
|
204 | } |
|
205 | ||
206 | /** |
|
207 | * @param QueryBuilder $queryBuilder |
|
208 | * @param Filter|QueryModifier|mixed|null $specification |
|
209 | * @param string $alias |
|
210 | * |
|
211 | * @throws \InvalidArgumentException |
|
212 | */ |
|
213 | protected function applySpecification(QueryBuilder $queryBuilder, $specification = null, $alias = null) |
|
214 | { |
|
215 | if (null === $specification) { |
|
216 | return; |
|
217 | } |
|
218 | ||
219 | if (!$specification instanceof QueryModifier && !$specification instanceof Filter) { |
|
220 | throw new \InvalidArgumentException(sprintf( |
|
221 | 'Expected argument of type "%s" or "%s", "%s" given.', |
|
222 | QueryModifier::class, |
|
223 | Filter::class, |
|
224 | is_object($specification) ? get_class($specification) : gettype($specification) |
|
225 | )); |
|
226 | } |
|
227 | ||
228 | if ($specification instanceof QueryModifier) { |
|
229 | $specification->modify($queryBuilder, $alias ?: $this->getAlias()); |
|
230 | } |
|
231 | ||
232 | if ($specification instanceof Filter && |
|
233 | ($filter = $specification->getFilter($queryBuilder, $alias ?: $this->getAlias())) && |
|
234 | ($filter = trim($filter)) |
|
235 | ) { |
|
236 | $queryBuilder->andWhere($filter); |
|
237 | } |
|
238 | } |
|
239 | } |
|
240 |
@@ 29-235 (lines=207) @@ | ||
26 | /** |
|
27 | * This trait should be used by a class extending \Doctrine\ORM\EntityRepository. |
|
28 | */ |
|
29 | trait EntitySpecificationRepositoryTrait |
|
30 | { |
|
31 | /** |
|
32 | * @var string alias |
|
33 | */ |
|
34 | private $alias = 'e'; |
|
35 | ||
36 | /** |
|
37 | * Get results when you match with a Specification. |
|
38 | * |
|
39 | * @param Filter|QueryModifier $specification |
|
40 | * @param ResultModifier|null $modifier |
|
41 | * |
|
42 | * @return mixed[] |
|
43 | */ |
|
44 | public function match($specification, ResultModifier $modifier = null) |
|
45 | { |
|
46 | $query = $this->getQuery($specification, $modifier); |
|
47 | ||
48 | return $query->execute(); |
|
49 | } |
|
50 | ||
51 | /** |
|
52 | * Get single result when you match with a Specification. |
|
53 | * |
|
54 | * @param Filter|QueryModifier $specification |
|
55 | * @param ResultModifier|null $modifier |
|
56 | * |
|
57 | * @throw Exception\NonUniqueException If more than one result is found |
|
58 | * @throw Exception\NoResultException If no results found |
|
59 | * |
|
60 | * @return mixed |
|
61 | */ |
|
62 | public function matchSingleResult($specification, ResultModifier $modifier = null) |
|
63 | { |
|
64 | $query = $this->getQuery($specification, $modifier); |
|
65 | ||
66 | try { |
|
67 | return $query->getSingleResult(); |
|
68 | } catch (DoctrineNonUniqueResultException $e) { |
|
69 | throw new NonUniqueResultException($e->getMessage(), $e->getCode(), $e); |
|
70 | } catch (DoctrineNoResultException $e) { |
|
71 | throw new NoResultException($e->getMessage(), $e->getCode(), $e); |
|
72 | } |
|
73 | } |
|
74 | ||
75 | /** |
|
76 | * Get single result or null when you match with a Specification. |
|
77 | * |
|
78 | * @param Filter|QueryModifier $specification |
|
79 | * @param ResultModifier|null $modifier |
|
80 | * |
|
81 | * @throw Exception\NonUniqueException If more than one result is found |
|
82 | * |
|
83 | * @return mixed|null |
|
84 | */ |
|
85 | public function matchOneOrNullResult($specification, ResultModifier $modifier = null) |
|
86 | { |
|
87 | try { |
|
88 | return $this->matchSingleResult($specification, $modifier); |
|
89 | } catch (NoResultException $e) { |
|
90 | return null; |
|
91 | } |
|
92 | } |
|
93 | ||
94 | /** |
|
95 | * Get single scalar result when you match with a Specification. |
|
96 | * |
|
97 | * @param Filter|QueryModifier $specification |
|
98 | * @param ResultModifier|null $modifier |
|
99 | * |
|
100 | * @throw Exception\NonUniqueException If more than one result is found |
|
101 | * @throw Exception\NoResultException If no results found |
|
102 | * |
|
103 | * @return mixed |
|
104 | */ |
|
105 | public function matchSingleScalarResult($specification, ResultModifier $modifier = null) |
|
106 | { |
|
107 | $query = $this->getQuery($specification, $modifier); |
|
108 | ||
109 | try { |
|
110 | return $query->getSingleScalarResult(); |
|
111 | } catch (DoctrineNonUniqueResultException $e) { |
|
112 | throw new NonUniqueResultException($e->getMessage(), $e->getCode(), $e); |
|
113 | } |
|
114 | } |
|
115 | ||
116 | /** |
|
117 | * Get scalar result when you match with a Specification. |
|
118 | * |
|
119 | * @param Filter|QueryModifier $specification |
|
120 | * @param ResultModifier|null $modifier |
|
121 | * |
|
122 | * @throw Exception\NonUniqueException If more than one result is found |
|
123 | * @throw Exception\NoResultException If no results found |
|
124 | * |
|
125 | * @return mixed |
|
126 | */ |
|
127 | public function matchScalarResult($specification, ResultModifier $modifier = null) |
|
128 | { |
|
129 | $query = $this->getQuery($specification, $modifier); |
|
130 | ||
131 | return $query->getScalarResult(); |
|
132 | } |
|
133 | ||
134 | /** |
|
135 | * Prepare a Query with a Specification. |
|
136 | * |
|
137 | * @param Filter|QueryModifier $specification |
|
138 | * @param ResultModifier|null $modifier |
|
139 | * |
|
140 | * @return Query |
|
141 | */ |
|
142 | public function getQuery($specification, ResultModifier $modifier = null) |
|
143 | { |
|
144 | $query = $this->getQueryBuilder($specification)->getQuery(); |
|
145 | ||
146 | if (null !== $modifier) { |
|
147 | $modifier->modify($query); |
|
148 | } |
|
149 | ||
150 | return $query; |
|
151 | } |
|
152 | ||
153 | /** |
|
154 | * @param Filter|QueryModifier $specification |
|
155 | * @param string|null $alias |
|
156 | * |
|
157 | * @return QueryBuilder |
|
158 | */ |
|
159 | public function getQueryBuilder($specification, $alias = null) |
|
160 | { |
|
161 | $qb = $this->createQueryBuilder($alias ?: $this->getAlias()); |
|
162 | $this->applySpecification($qb, $specification, $alias); |
|
163 | ||
164 | return $qb; |
|
165 | } |
|
166 | ||
167 | /** |
|
168 | * Iterate results when you match with a Specification. |
|
169 | * |
|
170 | * @param Filter|QueryModifier $specification |
|
171 | * @param ResultModifier|null $modifier |
|
172 | * |
|
173 | * @return \Traversable |
|
174 | */ |
|
175 | public function iterate($specification, ResultModifier $modifier = null) |
|
176 | { |
|
177 | foreach ($this->getQuery($specification, $modifier)->iterate() as $row) { |
|
178 | yield current($row); |
|
179 | } |
|
180 | } |
|
181 | ||
182 | /** |
|
183 | * @param string $alias |
|
184 | * |
|
185 | * @return $this |
|
186 | */ |
|
187 | public function setAlias($alias) |
|
188 | { |
|
189 | $this->alias = $alias; |
|
190 | ||
191 | return $this; |
|
192 | } |
|
193 | ||
194 | /** |
|
195 | * @return string |
|
196 | */ |
|
197 | public function getAlias() |
|
198 | { |
|
199 | return $this->alias; |
|
200 | } |
|
201 | ||
202 | /** |
|
203 | * @param QueryBuilder $queryBuilder |
|
204 | * @param Filter|QueryModifier|mixed|null $specification |
|
205 | * @param string $alias |
|
206 | * |
|
207 | * @throws \InvalidArgumentException |
|
208 | */ |
|
209 | protected function applySpecification(QueryBuilder $queryBuilder, $specification = null, $alias = null) |
|
210 | { |
|
211 | if (null === $specification) { |
|
212 | return; |
|
213 | } |
|
214 | ||
215 | if (!$specification instanceof QueryModifier && !$specification instanceof Filter) { |
|
216 | throw new \InvalidArgumentException(sprintf( |
|
217 | 'Expected argument of type "%s" or "%s", "%s" given.', |
|
218 | QueryModifier::class, |
|
219 | Filter::class, |
|
220 | is_object($specification) ? get_class($specification) : gettype($specification) |
|
221 | )); |
|
222 | } |
|
223 | ||
224 | if ($specification instanceof QueryModifier) { |
|
225 | $specification->modify($queryBuilder, $alias ?: $this->getAlias()); |
|
226 | } |
|
227 | ||
228 | if ($specification instanceof Filter && |
|
229 | ($filter = $specification->getFilter($queryBuilder, $alias ?: $this->getAlias())) && |
|
230 | ($filter = trim($filter)) |
|
231 | ) { |
|
232 | $queryBuilder->andWhere($filter); |
|
233 | } |
|
234 | } |
|
235 | } |
|
236 |