# Cycle - сравние кода и генерируемого SQL
Включение логирования не вызывает никаких проблем. Можем писать их куда хотим. Логгер должен соответствовать [PSR Logger Interface](https://www.php-fig.org/psr/psr-3/#3-psrlogloggerinterface):
```cpp
$config = Bootstrap\Config::forDatabase(
'mysql:host=palace-db.x340.org;dbname=repetitors',
'user',
's3cretpassw0rd')
->withLogger(new testLogger()); // PSR Logger
$orm = Bootstrap\Bootstrap::fromConfig($config);
```
Сделал тестовую entity `Vuz` на нашей таблице **ri_vuzs**. Запустим и посмотрим, что будет в логах.
```shell
$ php -f test.php
```
```sql
-- Первый запуск - получаем информацию о таблицах, полях и индексах
SELECT COUNT(*)
FROM `information_schema`.`tables`
WHERE `table_schema` = 'repetitors'
AND `table_name` = 'ri_vuzs'
SHOW FULL COLUMNS FROM `ri_vuzs`
SHOW INDEXES FROM `ri_vuzs`
SELECT *
FROM `information_schema`.`referential_constraints`
WHERE `constraint_schema` = 'repetitors'
AND `table_name` = 'ri_vuzs'
SHOW INDEXES FROM `ri_vuzs`
SHOW TABLE STATUS WHERE `Name` = 'ri_vuzs'
```
```cpp
$orm
->getRepository(Vuz::class)
->findByPK(100);
```
```sql
SELECT `vuz`.`id` AS `c0`, `vuz`.`name` AS `c1`, `vuz`.`alt` AS `c2`
FROM `ri_vuzs` AS `vuz`
WHERE `vuz`.`id` = 100
LIMIT 1
```
```cpp
$orm
->getRepository(Vuz::class)
->findAll()
```
```sql
SELECT `vuz`.`id` AS `c0`, `vuz`.`name` AS `c1`, `vuz`.`alt` AS `c2`
FROM `ri_vuzs` AS `vuz`
```
```cpp
$orm
->getRepository(Vuz::class)
->findAll(['alt' => 'mgafk']);
```
```sql
SELECT `vuz`.`id` AS `c0`, `vuz`.`name` AS `c1`, `vuz`.`alt` AS `c2`
FROM `ri_vuzs` AS `vuz`
WHERE `vuz`.`alt` = 'mgafk'
```
```cpp
$orm
->getRepository(Vuz::class)
->findAll(['name' => 'Ассоциация Профессионалов Фитнеса'])
```
```sql
SELECT `vuz`.`id` AS `c0`, `vuz`.`name` AS `c1`, `vuz`.`alt` AS `c2`
FROM `ri_vuzs` AS `vuz`
WHERE `vuz`.`name` = 'Ассоциация Профессионалов Фитнеса'
```
```cpp
$orm
->getRepository(Vuz::class)
->select()
->where('alt', 'mgafk')
->orWhere('alt', 'pifk')
->fetchAll();
```
```sql
SELECT `vuz`.`id` AS `c0`, `vuz`.`name` AS `c1`, `vuz`.`alt` AS `c2`
FROM `ri_vuzs` AS `vuz`
WHERE `vuz`.`alt` = 'mgafk' OR `vuz`.`alt` = 'pifk'
```
Немного примеров посложнее (из доков Cycle ORM):
```cpp
$select
->distinct()
->where('balance', '>', new Expression($qb->resolve('orders.total')))
->andWhere('orders.status', 'pending');
```
```sql
SELECT DISTINCT
...
FROM "users" AS "user"
INNER JOIN "orders" AS "user_orders"
ON "user_orders"."user_id" = "user"."id"
WHERE "user"."balance" > "user_orders"."total"
AND "user_orders"."status" = 'pending'
```
Как можно сделать low level запросы:
```cpp
$query = $select->buildQuery();
$query
->columns('id', new Expression('SUM(balance)'))
->groupBy('id');
$query->fetchAll();
```
```sql
SELECT "id", SUM("balance")
FROM "users" AS "user"
GROUP BY "id"
```
Пример с вложенными селектами:
```cpp
$users = $orm->getRepository(User::class)->select();
$orders = $orm->getRepository(Order::class)->select();
// only orders of specific user (fallback to native column name)
$sumOrders = $orders->where('user_id', new Expression($users->getBuilder()->resolve('id')))->buildQuery();
$sumOrders->columns(new Expression('SUM('. $orders->getBuilder()->resolve('total') .')'));
$users->where(
$sumOrders, '>=', new Expression($users->getBuilder()->resolve('balance'))
);
```
```sql
SELECT
...
FROM "users" AS "user"
WHERE (
SELECT
SUM("order"."total")
FROM "orders" AS "order"
WHERE "order"."user_id" = "user"."id"
) >= "user"."balance"
```
```cpp
$users->load('posts', [
'where' => function($qb) {
$qb->distinct()->where('comments.id', '!=', null);
}
]);
```
```sql
SELECT
"user"."id" AS "c0", "user"."email" AS "c1", "user"."balance" AS "c2"
FROM "user" AS "user"
SELECT DISTINCT
"user_posts"."id" AS "c0", "user_posts"."user_id" AS "c1", "user_posts"."title" AS "c2"
FROM "post" AS "user_posts"
INNER JOIN "comment" AS "user_posts_comments"
ON "user_posts_comments"."post_id" = "user_posts"."id"
WHERE "user_posts"."user_id" IN (1, 2)
AND ("user_posts_comments"."id" IS NOT NULL)
```