У меня есть контракт класса, который содержит абстрактный атрибут 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?