Это может быть невозможно при стандартном использовании Doctrine, но вы можете обойти это.
Если вы используете метаданные класса, вы можете выбрать свой столбец дискриминатора.
Взгляните на черту, которую я создал, чтобы решить проблему в моем приложении:
namespace App\Doctrine\Repository;
trait DiscriminatorTrait
{
abstract public function getClassMetadata();
abstract public function getEntityManager();
private function updateDiscriminatorColumn($id, $class)
{
$classMetadata = $this->getClassMetadata();
if (!in_array($class, $classMetadata->discriminatorMap)) {
throw new \Exception("invalid discriminator class: " . $class);
}
$identifier = $classMetadata->fieldMappings[$classMetadata->identifier[0]]["columnName"];
$column = $classMetadata->discriminatorColumn["fieldName"];
$value = array_search($class, $classMetadata->discriminatorMap);
$connection = $this->getEntityManager()->getConnection();
$connection->update(
$classMetadata->table["name"],
[$column => $value],
[$identifier => $id]
);
}
}
Я должен предупредить вас, хотя, когда ваши подклассы имеют (много) дополнительных полей, вам нужно будет заполнить или очистить их вручную впоследствии.