Doctrine 2 присоединяется к PK в поле JSONb - PullRequest
0 голосов
/ 14 февраля 2019

В нашей системе есть таблица для отслеживания событий.Эта таблица с именем Event имеет столбец JSONb source для хранения ссылок на объекты в других таблицах:

| uuid                                 | name                                      | source                                                   |
+--------------------------------------+-------------------------------------------+----------------------------------------------------------+
| 7916c5c9-3af2-41ce-81e4-776847029b08 | App\LoginRequest\LoginRequestExpiredEvent | {"loginRequest": "4dda7873-534d-4c0c-853b-65b4b1056dae"} |

Упрощенная login_request таблица выглядит следующим образом:

| uuid                                 | expireAt            |
+--------------------------------------+---------------------+
| 4dda7873-534d-4c0c-853b-65b4b1056dae | 2019-02-14 08:00:00 |
| 13c85e8c-e2dc-4b3f-aaf5-25920e2c4d04 | 2019-02-14 22:00:00 |

Iхотел бы ВЫБРАТЬ все сущности LoginRequest, на которые имеются ссылки в таблице событий.Пожалуйста, помните, что обе таблицы не имеют никакого отношения между ключами!Ссылка на LoginRequest только через поле JSONb.RAW SQL работает так, как ожидалось:

SELECT *
FROM login_request AS lr
JOIN event AS ev ON ev.source->>'loginRequest' = text(lr.uuid)

возвращая набор результатов, например:

| lr.uuid                              | lr.expireAt         | ev.uuid                              | ev.name                                   | ev.source                                                |
+--------------------------------------+---------------------+--------------------------------------+-------------------------------------------+----------------------------------------------------------+
| 4dda7873-534d-4c0c-853b-65b4b1056dae | 2019-02-14 08:00:00 | 7916c5c9-3af2-41ce-81e4-776847029b08 | App\LoginRequest\LoginRequestExpiredEvent | {"loginRequest": "4dda7873-534d-4c0c-853b-65b4b1056dae"} |

У меня проблемы с получением такой же функциональности, как RAW SQL в DQL Doctrine:

<?php

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\Query\Expr\Join;

class LoginRequestRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, LoginRequestEntity::class);
    }

    public function findExpiredWithEvent()
    {
        $qb = $this->createQueryBuilder('lr');
        $qb
            ->select('lr')
            ->join(
                EventEntity::class,
                'ev',
                Join::ON,
                "ev.source->>'loginRequest' = text(lr.uuid)"
            );

        return $qb->getQuery()->getResult();
    }
}

Я не могу заставить JOIN работать в полевых условиях JSONb.Например, приведенный выше вызов построителя запросов возвращает исключение:

In QueryException.php line 54:

  [Syntax Error] line 0, col 104: Error: Expected end of string, got 'ON'


In QueryException.php line 43:

  SELECT lr FROM App\LoginRequest\LoginRequestEntity lr
  INNER JOIN App\Event\EventEntity ev
  ON ev.source->>'loginRequest' = text(lr.uuid)

Можно ли сделать свойство столбца JOIN on JSONb из другой таблицы в построителе запросов Doctrine?

1 Ответ

0 голосов
/ 06 марта 2019

У меня есть аналогичные sql:

select distinct lru.id, lru.* from tstdf_lru as lru inner join tsrec_failure as failure on failure.lru_id = lru.id inner join wrks_event as event on failure.failure_group_id = (event.data->>'failureGroupId')::BIGINT

Может быть, это может помочь вам.

...