Я использую 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