Symfony 鉴别器列:类没有名为type的字段或关联

Symfony 鉴别器列:类没有名为type的字段或关联,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个类约定,它包含抽象属性contracnfo Type /** * @var ContractInfoType|null * * @ORM\OneToOne(targetEntity="ContractInfoType", cascade={"persist"}) * @ORM\JoinColumn(name="contract_info_type_id", referencedColumnName="id", nullable=true) */ private $contrac

我有一个类约定,它包含抽象属性contracnfo Type

/**
 * @var ContractInfoType|null
 *
 * @ORM\OneToOne(targetEntity="ContractInfoType", cascade={"persist"})
 * @ORM\JoinColumn(name="contract_info_type_id", referencedColumnName="id", nullable=true)
 */
private $contractInfoType;
CompactInfo类型是一个抽象实体:CompactInfo Pro和CompactInfo ASSO继承自它们

/**
 * 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;
}
以及继承CompactInfo类型的类

/**
 * 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"
然而,当我试图这样做的时候

$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
这是有意义的,因为我没有在实体中声明真正的字段类型


我应该如何使这与教条一起工作

您似乎无法以这种方式使用鉴别器。在DQL中,尝试使用“INSTANCE OF”而不是join


您似乎无法以这种方式使用鉴别器。在DQL中,尝试使用“INSTANCE OF”而不是join