1

在我的数据库中,我有一个 tablefile和一个 table file_content。该file表存储文件的元数据,例如namemime等等。file_content存储带有文件内容的 blob 。仅出于性能原因,我不会将 blob 与元数据存储在同一个表中。

对于我的项目的“版本 2”,我正在研究 Doctrine (2.3)。对我来说,“文件”似乎是一个实体,具有 , , 等属性namemime应该extensioncontent这样使用:

$file = new File();
$file->setName('hello.txt');
$file->setMime('text/plain');
$file->setContent('Hello world!')
$em->persist($file);
$em->flush();

这种行为可能吗?对我来说,为实际上只是一个实体的东西创建两个实体是没有意义的。我在文档中找不到任何关于它的内容,我在一个 2 岁的主题中读到,在 Doctrine 2.1 中是不可能的:Doctrine 2.1 - Map entity to multiple tables

有人建议如何正确处理这个问题?我是 Doctrine 的新手,并且一直在玩弄它,看看它是否是我项目的正确选择。谢谢。

4

3 回答 3

1

即使这是一个较老的问题,我也会建议一种不同的方法。您应该制作三个,而不是制作两个实体。

创建包含名称、mimetype 等的 FileMetadata。创建包含内容的 FileContent。然后,创建第三个实体文件,它与其他类型中的一种保持一对一的连接,并为其提供一堆方法,这些方法只需调用子实体上的匹配方法。

因此,例如在 File 中,setName 方法如下所示:

  public function setName() {
    $this->getFileMetadata()->getName();
  }

设置看起来像这样:

  public function setName( $name ) {
    $this->getFileMetadata()->setName( $name );
  }

File 实体的构造函数应该在创建时创建一个新的 FileMetadata 和一个新的 FileContent,并且不应该有 setFilemetadata 或 setFilecontent 方法;这两个实体应该完全不受您的应用程序的影响。

现在你有了 File 实体,它的处理方式与你想要的完全一样(一个实体,没有额外的子实体),它仍然整齐地存储在两个(嗯,三个真的)不同的表中。

于 2013-11-15T09:12:44.283 回答
0

你有能力改变你的数据库的模式吗?如果是这样,我会考虑将其合并到一张表中。

除此之外,您可能想在 Doctrine 中尝试一对一的关系。也许是这样的:

class File {
    private $id;
    private $name;
    private $mime;
    private $content;
}

class Content {
    private $id;
    private $data;
    private $fileId;
}

如果您将 Content->fileId 以一对一的关系映射到 File->id,那么您可以执行以下操作:

$file->getContent()->getData();
$file->getContent()->setData("something different");

以下是有关一对一映射的更多信息:http: //docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#one-to-one-unidirectional

于 2013-08-13T15:58:12.157 回答
0

您可以映射两个表,生成Fileand FileContent,并在两者之间添加一对一的关系。然后为类中的文件内容添加getter/setter方法File。在这些你必须调用相应的方法FileContent

于 2017-07-04T13:30:19.887 回答