【问题标题】:Query on Doctrine class table inheritance with required fields使用必填字段查询 Doctrine 类表继承
【发布时间】:2019-10-11 10:31:58
【问题描述】:

我的域有一个父类IncidenceMessage 和几个子类(即IncidenceMessageText)。 我有以下类表继承配置:

Domain\Model\IncidenceMessage\IncidenceMessage:
    type: entity
    repositoryClass: Infrastructure\Domain\Model\IncidenceMessage\DoctrineIncidenceMessageRepository
    table: incidence_messages
    inheritanceType: JOINED
    discriminatorColumn:
        name: type
        type: string
        length: 30
    discriminatorMap:
        text: IncidenceMessageText
        image: IncidenceMessageImage
        audio: IncidenceMessageAudio
        video: IncidenceMessageVideo
    fields:
        ...

我可以正确创建任何IncidenceMessage 实体。

数据库中只有一个IncidenceMessageText,当我尝试获取事件消息时,我收到以下错误:

TypeError: Argument 1 passed to Domain\Model\File\FileId::__construct() must be of the type string, null given

FileId是一个值对象,代表一个File实体的id)

IncidenceMessageImage 有一个 File 字段,它是一个外键,它是必需的。

IncidenceMessageText 没有该字段时,Doctrine 获取 File 对我来说毫无意义。

在调试时,我发现教义对每个 IncidenceMessage 表执行带有 LEFT JOIN 的 SELECT,这调用了我的 FileTypeId::convertToPHPValue 方法:

class FileIdType extends Type
{
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return new FileId($value);
    }
}

AFAIK,这里的问题是子类有必填字段,但这不应该成为一个障碍,对吧?

【问题讨论】:

  • Doctrine 本身从不使用类的构造函数。一切都是使用反射来直接访问类属性完成的。您的代码正在某处运行 new FileId()。
  • @Cerad 实际上,new FileId() 是自定义 DBAL 类型(方法 convertToPHPValue),但我不明白为什么要调用它。

标签: symfony doctrine discriminator class-table-inheritance


【解决方案1】:

我找到了一种可能的解决方法。在我的自定义 DBAL 类型 FileIdType 上,我在实例化 FileId 之前检查了该值是否为空:

use Doctrine\DBAL\Types\Type;

class FileIdType extends Type
{
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value ? new FileId($value) : null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多