Symonfy2, Doctrine: дублировать, по умолчанию или игнорировать DiscriminatorMap? - PullRequest
0 голосов
/ 11 мая 2018

Как включить дублирование Карт Дискриминатора, разрешить отображение по умолчанию, или полностью игнорировать отображения Дискриминатора при выполнении запроса DQL?

Настройка:

// DQL Query:
$this->createQueryBuilder('s')
     ->select(['s.serverId', 'p.projectName'])
     ->leftJoin('s.serverServices', 'ss')
     ->leftJoin('ss.serverServiceProjects', 'ps')
     ->leftJoin('ps.project', 'p')
     ->getQuery()
     ->getArrayResult()

// Mapping
/**
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="service_type_id", type="integer")
 * @ORM\DiscriminatorMap({
 *     "1" = "AppBundle\Entity\ServerService",
 *     "2" = "AppBundle\Entity\ServerService",
 *       [...]
 *     "12" = "AppBundle\Entity\Service\SubService",
 *     "" = "AppBundle\Entity\ServerService"
 * })
 */

Сгенерированная часть join :

   LEFT JOIN server_services s2_ ON s0_.server_id = s2_.server_id AND s2_.service_type_id IN ('1', '12') 

Это совершенно неверно.У меня есть полное отображение от 1 до 12. И "" соответствует пустой строке.Если строка не имеет известного отображения (в моем коде) ИЛИ если она пуста, она должна быть установлена ​​в базу по умолчанию ServerService.

Я нашел этот пост: Не указывать часть дискриминатораof Doctrine 'сгенерированный SQL

Тем не менее, он еще в 2014 году, упомянул разницу в версии и не компенсирует дубликата или по умолчанию Отображения.

РЕДАКТИРОВАТЬ: Для записи я попытался игнорировать маршрут - он не работал.

   $q->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, MySqlWalker::class)
        ->setHint(MySqlWalker::IGNORE_DISCRIMINATION, array('ss'));

По-прежнему возвращает вышеуказанный оператор SQL Joint.Это вызывает MySqlWalker;он входит в вызов setInheritanceType(), но не игнорирует отображение Discriminator.: /

1 Ответ

0 голосов
/ 14 мая 2018

Нашел ответ на один параметр: Игнорирование

В Doctrine 2.2.x мои утверждения были в предложении JOIN, а не WHERE.Используя пример в Оставить часть дискриминатора сгенерированного Doctrine '* SQL , мне пришлось перегрузить метод ->walkJoin(), чтобы игнорирование работало правильно:

/**
 * {@inheritdoc}
 */
public function walkJoin($join)
{
    $this->checkForHint();
    return parent::walkJoin($join);
}

protected function checkForHint()
{
    $ignoreDescription = $this->getQuery()->getHint(self::IGNORE_DISCRIMINATION);

    if ($ignoreDescription) {
        foreach ($this->getQueryComponents() as $k => $component) {
            if (in_array($k, $ignoreDescription)) {
                /** @var $meta ClassMetadata */
                $meta = $component['metadata'];
                $meta->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE);
            }
        }
    }
}

Все еще не разрешено Дублировать или По умолчанию Значения дискриминатора ...

...