@@ -34,9 +34,9 @@ use app\models\Comment;
34
34
35
35
// Выбираем адреса с городом, местами и комментариями о местах
36
36
$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'] )
40
40
->all();
41
41
42
42
print_r($result);
@@ -47,6 +47,12 @@ print_r($result);
47
47
[id] => 1
48
48
[city_id] => 1
49
49
[name] => Tverskaya st., 7
50
+ [city] => Array
51
+ (
52
+ [id] => 1
53
+ [name] => Moscow
54
+ )
55
+
50
56
[places] => Array
51
57
(
52
58
[0] => Array
@@ -100,19 +106,19 @@ print_r($result);
100
106
101
107
)
102
108
103
- [city] => Array
104
- (
105
- [id] => 1
106
- [name] => Moscow
107
- )
108
-
109
109
)
110
110
111
111
[1] => Array
112
112
(
113
113
[id] => 2
114
114
[city_id] => 1
115
115
[name] => Schipok st., 1
116
+ [city] => Array
117
+ (
118
+ [id] => 1
119
+ [name] => Moscow
120
+ )
121
+
116
122
[places] => Array
117
123
(
118
124
[0] => Array
@@ -137,19 +143,19 @@ print_r($result);
137
143
138
144
)
139
145
140
- [city] => Array
141
- (
142
- [id] => 1
143
- [name] => Moscow
144
- )
145
-
146
146
)
147
147
148
148
[2] => Array
149
149
(
150
150
[id] => 3
151
151
[city_id] => 2
152
152
[name] => Mayakovskogo st., 12
153
+ [city] => Array
154
+ (
155
+ [id] => 2
156
+ [name] => St. Petersburg
157
+ )
158
+
153
159
[places] => Array
154
160
(
155
161
[0] => Array
@@ -185,19 +191,19 @@ print_r($result);
185
191
186
192
)
187
193
188
- [city] => Array
189
- (
190
- [id] => 2
191
- [name] => St. Petersburg
192
- )
193
-
194
194
)
195
195
196
196
[3] => Array
197
197
(
198
198
[id] => 4
199
199
[city_id] => 2
200
200
[name] => Galernaya st., 3
201
+ [city] => Array
202
+ (
203
+ [id] => 2
204
+ [name] => St. Petersburg
205
+ )
206
+
201
207
[places] => Array
202
208
(
203
209
[0] => Array
@@ -222,12 +228,6 @@ print_r($result);
222
228
223
229
)
224
230
225
- [city] => Array
226
- (
227
- [id] => 2
228
- [name] => St. Petersburg
229
- )
230
-
231
231
)
232
232
233
233
)*/
@@ -238,36 +238,23 @@ print_r($result);
238
238
// - если подходящих комментариев нет, место не попадает в выборку (inner join)
239
239
// - для каждого места считаем количество комментариев, количество оценок "5" и среднюю оценку среди оценок не ниже 3
240
240
$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'] ,
244
244
'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
- })
265
245
->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
+ }
270
255
}
256
+
257
+ $place['mark_average'] /= $place['comments_count'];
271
258
})
272
259
->all();
273
260
@@ -279,6 +266,19 @@ print_r($result);
279
266
[id] => 1
280
267
[address_id] => 1
281
268
[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
+
282
282
[comments] => Array
283
283
(
284
284
[0] => Array
@@ -301,11 +301,21 @@ print_r($result);
301
301
302
302
)
303
303
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
304
314
[address] => Array
305
315
(
306
- [id] => 1
316
+ [id] => 2
307
317
[city_id] => 1
308
- [name] => Tverskaya st., 7
318
+ [name] => Schipok st., 1
309
319
[city] => Array
310
320
(
311
321
[id] => 1
@@ -314,16 +324,6 @@ print_r($result);
314
324
315
325
)
316
326
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
327
327
[comments] => Array
328
328
(
329
329
[0] => Array
@@ -337,19 +337,6 @@ print_r($result);
337
337
338
338
)
339
339
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
-
353
340
[comments_count] => 1
354
341
[mark_five_count] => 1
355
342
[mark_average] => 5
@@ -360,6 +347,19 @@ print_r($result);
360
347
[id] => 5
361
348
[address_id] => 3
362
349
[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
+
363
363
[comments] => Array
364
364
(
365
365
[0] => Array
@@ -373,11 +373,21 @@ print_r($result);
373
373
374
374
)
375
375
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
376
386
[address] => Array
377
387
(
378
- [id] => 3
388
+ [id] => 4
379
389
[city_id] => 2
380
- [name] => Mayakovskogo st., 12
390
+ [name] => Galernaya st., 3
381
391
[city] => Array
382
392
(
383
393
[id] => 2
@@ -386,16 +396,6 @@ print_r($result);
386
396
387
397
)
388
398
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
399
399
[comments] => Array
400
400
(
401
401
[0] => Array
@@ -409,19 +409,6 @@ print_r($result);
409
409
410
410
)
411
411
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
-
425
412
[comments_count] => 1
426
413
[mark_five_count] => 0
427
414
[mark_average] => 3
@@ -433,7 +420,7 @@ print_r($result);
433
420
// Получаем города из списка ID с адресами
434
421
$cityIds = City::find()->limit(2)->offset(1)->select('id')->column();
435
422
$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'] )
437
424
->filter(function(Query $q) use ($cityIds) {
438
425
$q->andWhere(['c.id' => $cityIds])->orderBy(['a.id' => SORT_ASC]);
439
426
})
@@ -481,7 +468,7 @@ print_r($result);
481
468
482
469
// Используем QueryRelationDataProvider для пагинации
483
470
$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'] );
485
472
486
473
$dataProvider = new QueryRelationDataProvider([
487
474
'queryRelationManager' => $qrm,
0 commit comments