Столбец дискриминатора: класс не имеет поля или ассоциации с именем типа - PullRequest
0 голосов
/ 26 мая 2020

У меня есть контракт класса, который содержит абстрактный атрибут contractInfo Type

/**
 * @var ContractInfoType|null
 *
 * @ORM\OneToOne(targetEntity="ContractInfoType", cascade={"persist"})
 * @ORM\JoinColumn(name="contract_info_type_id", referencedColumnName="id", nullable=true)
 */
private $contractInfoType;

ContractInfoType - это абстрактная сущность: ContractInfoPro и ContractInfoAsso наследуют от них

/**
 * ContractInfoType
 *
 * @ORM\Table(name="contract_info_type",
 *   indexes={
 *     @ORM\Index(name="IDX_TYPE", columns={"type"}),
 *   }
  * )
 * @ORM\Entity(repositoryClass="App\Repository\Contract\ContractInfoTypeRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap(
 *     {
 *      "pro" = "App\Entity\Contract\Type\ContractInfoPro",
 *      "asso" = "App\Entity\Contract\Type\ContractInfoAsso"
 *     }
 * )
 * @ORM\HasLifecycleCallbacks
 */
abstract class ContractInfoType
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    public function getId(): int
    {
        return $this->id;
    }

    public function setId(int $id): self
    {
        $this->id = $id;

        return $this;
    }

    abstract public function getType(): string;
}

и класс, который наследует ContractInfoType

/**
 * ContractInfoAsso
 *
 * @ORM\Table(name="contract_info_asso")
 * @ORM\Entity(repositoryClass="App\Repository\Contract\ContractInfoAssoRepository")
 * @ORM\HasLifecycleCallbacks
 */
class ContractInfoAsso extends ContractInfoType
{
    const TYPE = 'asso';

    /**
     * @var string
     *
     * @ORM\Column(name="num_prefecture", type="string", length=40, nullable=true)
     *
     * @Assert\Type(
     *     type="string",
     *     message="The value {{ value }} is not a valid {{ type }}."
     * )
     * @Assert\Length(
     *      max = 40,
     *      maxMessage = "num_prefecture value cannot be longer than {{ limit }} characters"
     * )
     */
    private $numPrefecture;

    /**
     * @return string
     */
    public function getNumPrefecture(): string
    {
        return $this->numPrefecture;
    }

    /**
     * @param string $numPrefecture
     */
    public function setNumPrefecture(string $numPrefecture): self
    {
        $this->numPrefecture = $numPrefecture;

        return $this;
    }

    public function getType(): string
    {
        return self::TYPE;
    }
}

Моя цель - отфильтровать контракт по типу столбца дискриминатора, как я бы сделал в SQL:

 select * from contract left join contract_info_type cit on contract.contract_info_type_id = cit.id where cit.type LIKE "pro"

Однако, когда я пытаюсь сделать это с помощью doctrine таким образом

$queryBuilder->leftJoin('contract.contractInfoType', 'type');
$queryBuilder->andWhere('type.type = :type");

Я получил ошибку

[Semantical Error] line 0, col 183 near 'type = :type': Error: Class App\\Entity\\Contract\\ContractInfoType has no field or association named type

Что имеет смысл, поскольку у меня нет реального типа поля, объявленного в сущности.

Как мне сделать эта работа с doctrine?

1 Ответ

2 голосов
/ 26 мая 2020

Похоже, вы не можете использовать дискриминатор таким образом. В вашем DQL попробуйте использовать "INSTANCE OF" вместо соединения.

Подробнее

Возможный дубликат

...