Sonata Exporter и Oracle: экспорт со связью «многие ко многим» и столбцом «CLOB» создает неверный запрос - PullRequest
0 голосов
/ 07 марта 2019

Я использую Sonata Exporter, Doctrine ORM и Oracle DB. У моего объекта есть связь «многие ко многим» и текстовое свойство, сопоставленное типу данных «CLOB».

Класс сущности (отрывок):

/**
 * @ORM\ManyToMany(targetEntity="Project", inversedBy="partModels", cascade={"persist"})
 * @ORM\JoinTable(name="abstract_pm_x_project",
 *     joinColumns={@ORM\JoinColumn(name="part_model_id", referencedColumnName="id", nullable=false)},
 *     inverseJoinColumns={@ORM\JoinColumn(name="project_id", referencedColumnName="id", nullable=false)}
 * )
 */
protected $projects;

/**
 * @ORM\Column(type="text", nullable=true)
 */
protected $description;

Когда я экспортирую список нефильтрованный из Sonata Admin, создается следующий запрос (отрывок):

SELECT DISTINCT a0_.id AS ID_0, a0_.active AS ACTIVE_1, a0_.title AS TITLE_2, a0_.description AS DESCRIPTION_4, a0_.dtype AS DTYPE_13
FROM abstract_pm a0_
WHERE a0_.dtype IN ('partmodel')
ORDER BY a0_.title ASC;

Это отлично работает.

Когда я экспортирую список , отфильтрованный по ассоциации «многие ко многим» , запрос выглядит следующим образом:

SELECT DISTINCT a0_.id AS ID_0, a0_.active AS ACTIVE_1, a0_.title AS TITLE_2, a0_.description AS DESCRIPTION_4, a0_.dtype AS DTYPE_13
FROM abstract_pm a0_
LEFT JOIN abstract_pm_x_project a2_ ON a0_.id = a2_.part_model_id
LEFT JOIN project p1_ ON p1_.id = a2_.project_id
WHERE (p1_.id IN (1)) AND a0_.dtype IN ('partmodel')
ORDER BY a0_.title ASC;

Это приводит к следующей ошибке (кстати, этот запрос прекрасно работает в MySQL):

ORA-00932: Inkonsistente Datentypen: - erwartet, CLOB erhalten
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:

Не допускается использование столбца CLOB в запросе DISTINCT.

Запрос генерируется в Sonata \ DoctrineORMAdminBundle \ Model \ ModelManager-> getDataSourceIterator () .
Смотри: https://github.com/sonata-project/SonataDoctrineORMAdminBundle/blob/49da00385f402c712fd155c3872a72030bd520b5/src/Model/ModelManager.php#L457

Вопрос

Есть ли хороший способ контролировать, как генерируется этот запрос? Стоит ли искать расширение Sonata-Project / Exporter, SonataDoctrineORMAdminBundle или Doctrine / ORM для удовлетворения этого конкретного требования?

Примечание. Представление списка в SonataAdminBundle работает нормально, так как оно сначала использует запрос DISTINCT с минимальной информацией и использует извлеченные идентификаторы для запроса остальных данных:

SELECT a.* FROM (
    SELECT DISTINCT a0_.id AS ID_0, a0_.title AS TITLE_1, a0_.id AS ID_2
    FROM abstract_pm a0_
    LEFT JOIN abstract_pm_x_project a2_ ON a0_.id = a2_.part_model_id
    LEFT JOIN project p1_ ON p1_.id = a2_.project_id
    WHERE (p1_.id IN (1)) AND a0_.dtype IN ('partmodel')
    ORDER BY a0_.title ASC, a0_.id ASC) a
WHERE ROWNUM <= 25;

Несколько похожая проблема также обсуждалась для пейджера в 2012 году: https://github.com/sonata-project/SonataDoctrineORMAdminBundle/issues/56

Настройка

  • PHP 7.3
  • Symfony 3.4
  • Учение ОРМ 2.6.3
  • Доктрина DBAL 2.9.2
  • SonataAdminBundle 3.39.0
  • SonataDoctrineORMAdminBundle 3.8.3
  • SonataExporter 1.11
  • База данных Oracle 12.2
...