Skip to content

Commit 48810ce

Browse files
committed
readme upd
1 parent 518c3f9 commit 48810ce

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# yii2-query-relation-manager
2+
Реализует функционал получения данных из БД с отношениями "один к одному" и "один ко многим" с использованием одного
3+
запроса к БД, а также с учетом всех ограничений в запросе при получении отношений.
4+
5+
### Примеры использования
6+
7+
Будем использоват следующие таблицы в БД с наборами полей:
8+
9+
- **city** (id, name)
10+
- **address** (id, city_id, name)
11+
- **place** (id, address_id, name)
12+
- **comment** (id, place_id, username, mark, text)
13+
14+
и соответствующие им классы моделей **ActiveRecord**:
15+
- app\models\\**City**
16+
- app\models\\**Address**
17+
- app\models\\**Place**
18+
- app\models\\**Comment**
19+
20+
```php
21+
<?php
22+
23+
use Smoren\Yii2\QueryRelationManager\QueryRelationManager;
24+
use app\models\City;
25+
use app\models\Address;
26+
use app\models\Place;
27+
use app\models\Comment;
28+
29+
// Выбираем адреса с городом, местами и комментариями о местах
30+
$result = QueryRelationManager::select(Address::class, 'a')
31+
->withSingle('city', City::class, 'c', 'a', 'id', 'city_id')
32+
->withMultiple('places', Place::class, 'p', 'a', 'address_id', 'id')
33+
->withMultiple('comments', Comment::class, 'cm', 'p', 'place_id', 'id')
34+
->all();
35+
36+
print_r($result);
37+
38+
39+
// Выбираем места с адресом и городом, а также комментариями, при чем:
40+
// - комментарии имеют оценку не ниже 3
41+
// - если подходящх комментариев нет, место не попадает в выборку (inner join)
42+
// - для каждого места считаем количество комментариев, количество оценок "5" и среднюю оценку среди оценок не ниже 3
43+
$result = QueryRelationManager::select(Place::class, 'p')
44+
->withSingle('address', Address::class, 'a', 'p', 'id', 'address_id')
45+
->withSingle('city', City::class, 'c', 'a', 'id', 'city_id')
46+
->withMultiple('comments', Comment::class, 'cm', 'p', 'place_id', 'id',
47+
'inner', 'and cm.mark >= :mark', [':mark' => 3])
48+
->modify('cm', function(array &$comment, array &$place) {
49+
if(!isset($place['comments_count'])) {
50+
$place['comments_count'] = 0;
51+
}
52+
53+
if(!isset($place['mark_five_count'])) {
54+
$place['mark_five_count'] = 0;
55+
}
56+
57+
if(!isset($place['mark_average'])) {
58+
$place['mark_average'] = 0;
59+
}
60+
61+
$place['comments_count']++;
62+
$place['mark_average'] += $comment['mark'];
63+
64+
if($comment['mark'] == 5) {
65+
$place['mark_five_count']++;
66+
}
67+
})
68+
->modify('p', function(array &$place) {
69+
if(!isset($place['mark_average'])) {
70+
$place['mark_average'] = 0;
71+
} else {
72+
$place['mark_average'] /= $place['comments_count'];
73+
}
74+
})
75+
->all();
76+
77+
print_r($result);
78+
79+
80+
// Получаем города из списка с адресами
81+
$cityIds = City::find()->limit(2)->offset(1)->select('id')->column();
82+
$result = QueryRelationManager::select(City::class, 'c')
83+
->withMultiple('addresses', Address::class, 'a', 'c', 'city_id', 'id')
84+
->filter(function(Query $q) use ($cityIds) {
85+
$q->andWhere(['c.id' => $cityIds]);
86+
})
87+
->all();
88+
89+
print_r($result);
90+
91+
```
92+
93+
Репозиторий с демонстрацией использования расширения: https://github.com/Smoren/yii2-query-relation-manager-demo

0 commit comments

Comments
 (0)