@@ -34,9 +34,9 @@ use app\models\Comment;
3434
3535// Выбираем адреса с городом, местами и комментариями о местах
3636$result = QueryRelationManager::select(Address::class, 'a')
37- ->withSingle('city', City::class, 'c', 'a', 'id', 'city_id')
38- ->withMultiple('places', Place::class, 'p', 'a', 'address_id', 'id')
39- ->withMultiple('comments', Comment::class, 'cm', 'p', 'place_id', 'id')
37+ ->withSingle('city', City::class, 'c', 'a', [ 'id' => 'city_id'] )
38+ ->withMultiple('places', Place::class, 'p', 'a', [ 'address_id' => 'id'] )
39+ ->withMultiple('comments', Comment::class, 'cm', 'p', [ 'place_id' => 'id'] )
4040 ->all();
4141
4242print_r($result);
@@ -47,6 +47,12 @@ print_r($result);
4747 [id] => 1
4848 [city_id] => 1
4949 [name] => Tverskaya st., 7
50+ [city] => Array
51+ (
52+ [id] => 1
53+ [name] => Moscow
54+ )
55+
5056 [places] => Array
5157 (
5258 [0] => Array
@@ -100,19 +106,19 @@ print_r($result);
100106
101107 )
102108
103- [city] => Array
104- (
105- [id] => 1
106- [name] => Moscow
107- )
108-
109109 )
110110
111111 [1] => Array
112112 (
113113 [id] => 2
114114 [city_id] => 1
115115 [name] => Schipok st., 1
116+ [city] => Array
117+ (
118+ [id] => 1
119+ [name] => Moscow
120+ )
121+
116122 [places] => Array
117123 (
118124 [0] => Array
@@ -137,19 +143,19 @@ print_r($result);
137143
138144 )
139145
140- [city] => Array
141- (
142- [id] => 1
143- [name] => Moscow
144- )
145-
146146 )
147147
148148 [2] => Array
149149 (
150150 [id] => 3
151151 [city_id] => 2
152152 [name] => Mayakovskogo st., 12
153+ [city] => Array
154+ (
155+ [id] => 2
156+ [name] => St. Petersburg
157+ )
158+
153159 [places] => Array
154160 (
155161 [0] => Array
@@ -185,19 +191,19 @@ print_r($result);
185191
186192 )
187193
188- [city] => Array
189- (
190- [id] => 2
191- [name] => St. Petersburg
192- )
193-
194194 )
195195
196196 [3] => Array
197197 (
198198 [id] => 4
199199 [city_id] => 2
200200 [name] => Galernaya st., 3
201+ [city] => Array
202+ (
203+ [id] => 2
204+ [name] => St. Petersburg
205+ )
206+
201207 [places] => Array
202208 (
203209 [0] => Array
@@ -222,12 +228,6 @@ print_r($result);
222228
223229 )
224230
225- [city] => Array
226- (
227- [id] => 2
228- [name] => St. Petersburg
229- )
230-
231231 )
232232
233233)*/
@@ -238,36 +238,23 @@ print_r($result);
238238// - если подходящих комментариев нет, место не попадает в выборку (inner join)
239239// - для каждого места считаем количество комментариев, количество оценок "5" и среднюю оценку среди оценок не ниже 3
240240$result = QueryRelationManager::select(Place::class, 'p')
241- ->withSingle('address', Address::class, 'a', 'p', 'id', 'address_id')
242- ->withSingle('city', City::class, 'c', 'a', 'id', 'city_id')
243- ->withMultiple('comments', Comment::class, 'cm', 'p', 'place_id', 'id',
241+ ->withSingle('address', Address::class, 'a', 'p', [ 'id' => 'address_id'] )
242+ ->withSingle('city', City::class, 'c', 'a', [ 'id' => 'city_id'] )
243+ ->withMultiple('comments', Comment::class, 'cm', 'p', [ 'place_id' => 'id'] ,
244244 'inner', 'and cm.mark >= :mark', [':mark' => 3])
245- ->modify('cm', function(array & $comment, array & $place) {
246- if(!isset($place['comments_count'])) {
247- $place['comments_count'] = 0;
248- }
249-
250- if(!isset($place['mark_five_count'])) {
251- $place['mark_five_count'] = 0;
252- }
253-
254- if(!isset($place['mark_average'])) {
255- $place['mark_average'] = 0;
256- }
257-
258- $place['comments_count']++;
259- $place['mark_average'] += $comment['mark'];
260-
261- if($comment['mark'] == 5) {
262- $place['mark_five_count']++;
263- }
264- })
265245 ->modify('p', function(array & $place) {
266- if(!isset($place['mark_average'])) {
267- $place['mark_average'] = 0;
268- } else {
269- $place['mark_average'] /= $place['comments_count'];
246+ $place['comments_count'] = count($place['comments']);
247+ $place['mark_five_count'] = 0;
248+ $place['mark_average'] = 0;
249+
250+ foreach($place['comments'] as $comment) {
251+ $place['mark_average'] += $comment['mark'];
252+ if($comment['mark'] == 5) {
253+ $place['mark_five_count']++;
254+ }
270255 }
256+
257+ $place['mark_average'] /= $place['comments_count'];
271258 })
272259 ->all();
273260
@@ -279,6 +266,19 @@ print_r($result);
279266 [id] => 1
280267 [address_id] => 1
281268 [name] => TC Tverskoy
269+ [address] => Array
270+ (
271+ [id] => 1
272+ [city_id] => 1
273+ [name] => Tverskaya st., 7
274+ [city] => Array
275+ (
276+ [id] => 1
277+ [name] => Moscow
278+ )
279+
280+ )
281+
282282 [comments] => Array
283283 (
284284 [0] => Array
@@ -301,11 +301,21 @@ print_r($result);
301301
302302 )
303303
304+ [comments_count] => 2
305+ [mark_five_count] => 1
306+ [mark_average] => 4
307+ )
308+
309+ [1] => Array
310+ (
311+ [id] => 3
312+ [address_id] => 2
313+ [name] => Stasova music school
304314 [address] => Array
305315 (
306- [id] => 1
316+ [id] => 2
307317 [city_id] => 1
308- [name] => Tverskaya st., 7
318+ [name] => Schipok st., 1
309319 [city] => Array
310320 (
311321 [id] => 1
@@ -314,16 +324,6 @@ print_r($result);
314324
315325 )
316326
317- [comments_count] => 2
318- [mark_five_count] => 1
319- [mark_average] => 4
320- )
321-
322- [1] => Array
323- (
324- [id] => 3
325- [address_id] => 2
326- [name] => Stasova music school
327327 [comments] => Array
328328 (
329329 [0] => Array
@@ -337,19 +337,6 @@ print_r($result);
337337
338338 )
339339
340- [address] => Array
341- (
342- [id] => 2
343- [city_id] => 1
344- [name] => Schipok st., 1
345- [city] => Array
346- (
347- [id] => 1
348- [name] => Moscow
349- )
350-
351- )
352-
353340 [comments_count] => 1
354341 [mark_five_count] => 1
355342 [mark_average] => 5
@@ -360,6 +347,19 @@ print_r($result);
360347 [id] => 5
361348 [address_id] => 3
362349 [name] => Mayakovskiy Store
350+ [address] => Array
351+ (
352+ [id] => 3
353+ [city_id] => 2
354+ [name] => Mayakovskogo st., 12
355+ [city] => Array
356+ (
357+ [id] => 2
358+ [name] => St. Petersburg
359+ )
360+
361+ )
362+
363363 [comments] => Array
364364 (
365365 [0] => Array
@@ -373,11 +373,21 @@ print_r($result);
373373
374374 )
375375
376+ [comments_count] => 1
377+ [mark_five_count] => 0
378+ [mark_average] => 4
379+ )
380+
381+ [3] => Array
382+ (
383+ [id] => 6
384+ [address_id] => 4
385+ [name] => Cafe on Galernaya
376386 [address] => Array
377387 (
378- [id] => 3
388+ [id] => 4
379389 [city_id] => 2
380- [name] => Mayakovskogo st., 12
390+ [name] => Galernaya st., 3
381391 [city] => Array
382392 (
383393 [id] => 2
@@ -386,16 +396,6 @@ print_r($result);
386396
387397 )
388398
389- [comments_count] => 1
390- [mark_five_count] => 0
391- [mark_average] => 4
392- )
393-
394- [3] => Array
395- (
396- [id] => 6
397- [address_id] => 4
398- [name] => Cafe on Galernaya
399399 [comments] => Array
400400 (
401401 [0] => Array
@@ -409,19 +409,6 @@ print_r($result);
409409
410410 )
411411
412- [address] => Array
413- (
414- [id] => 4
415- [city_id] => 2
416- [name] => Galernaya st., 3
417- [city] => Array
418- (
419- [id] => 2
420- [name] => St. Petersburg
421- )
422-
423- )
424-
425412 [comments_count] => 1
426413 [mark_five_count] => 0
427414 [mark_average] => 3
@@ -433,7 +420,7 @@ print_r($result);
433420// Получаем города из списка ID с адресами
434421$cityIds = City::find()->limit(2)->offset(1)->select('id')->column();
435422$result = QueryRelationManager::select(City::class, 'c')
436- ->withMultiple('addresses', Address::class, 'a', 'c', 'city_id', 'id')
423+ ->withMultiple('addresses', Address::class, 'a', 'c', [ 'city_id' => 'id'] )
437424 ->filter(function(Query $q) use ($cityIds) {
438425 $q->andWhere(['c.id' => $cityIds])->orderBy(['a.id' => SORT_ASC]);
439426 })
@@ -481,7 +468,7 @@ print_r($result);
481468
482469// Используем QueryRelationDataProvider для пагинации
483470$qrm = QueryRelationManager::select(City::class, 'c')
484- ->withMultiple('addresses', Address::class, 'a', 'c', 'city_id', 'id');
471+ ->withMultiple('addresses', Address::class, 'a', 'c', [ 'city_id' => 'id'] );
485472
486473$dataProvider = new QueryRelationDataProvider([
487474 'queryRelationManager' => $qrm,
0 commit comments