Доктрина: Проверьте, существует ли отношение для объекта Дискриминатор - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь проверить, существует ли связь, другими словами, является ли столбец NULL или заполнен.

Здесь у меня есть QueryBuilder:

$qb->select('v')
    ->from('Entities\Voucher', 'v')
    ->leftJoin('Entities\VoucherCopy', 'vc', \Doctrine\ORM\Query\Expr\Join::WITH, 'v.voucherCopy = vc.id')
    ->where("v.code LIKE :voucherCode")
    ->andWhere('vc.id IS NULL');

Этобыло бы хорошо, если бы VoucherCopy не расширял "сущности \ коды" - наследование одной таблицы

VoucherCopy:

class VoucherCopy extends Codes

коды:

/**
 * Entities\DiscountCode
 *
 * @Table(name="discount_code")
 * @Entity()
 *
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({"D" = "DiscountCode", "VT" = "PortalVoucher", "V" = "VoucherCopy"})
 */
class Codes

Проблема заключается в в том, что выполняемый SQL из этого построителя запросов:

SELECT v0_.*
FROM voucher v0_ 
LEFT JOIN discount_code d1_ ON (
    v0_.discount_code_id = d1_.id
) WHERE (v0_.code LIKE '%DA70511911%' AND d1_.id IS NULL) AND d1_.type IN ('V')
;

Примечание AND d1_.type IN ('V'). Это связано с тем, что DQL автоматически добавляет это, потому что знает, что это столбец дискриминатора для этой сущности, но при этом AND d1_.id IS NULL становится избыточным, поскольку я не могу проверить, не возникает ли связь с проверкой AND d1_.type IN ('V').

Возможно ли проверить, существует ли связь при использовании наследования одной таблицы?

Я пробовал leftJoin напрямую в Entities \ Code (родительский), но я не могу добавить столбец дискриминатора (тип) в качестве свойствапотому что вы получаете сообщение об ошибке: Дублируйте определение столбца type в сущности Entities \ Codes в сопоставлении столбца поля или дискриминатора.

...