如何一个主义实体保存到两个数据库表(用于MySQL的优化)(How to save one Doct

2019-10-29 05:52发布

在我的数据库我有一个表格file和表格file_content 。 该file表存储的文件的元数据,如namemime和更多一些。 该file_content存储与文件内容的斑点。 我不是存储在同一个表中的BLOB作为唯一的表现的原因的元数据。

对于我的项目的“第二版”我寻找到学说(2.3)。 在我看来,“文件”似乎是一个实体,如属性namemimeextensioncontent应该像这样使用:

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

这种行为是可能的吗? 对我来说是没有意义的东西,这真的只是一个实体创建两个实体。 在文档中我找不到任何关于它和我在一个2岁的主题阅读,这是不可能的教义2.1: 学说2.1 -地图实体到多个表

有人有任何建议如何正确处理呢? 我是新来的学说,并已被玩弄了一点,看它是否对我的项目是正确的选择。 谢谢。

Answer 1:

你必须改变你的数据库的模式的能力吗? 如果是的话,我会考虑合并到一个表这一点。

除非,你可能会想尝试学说一比一的关系。 也许是这样的:

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

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

如果映射内容 - > FILEID有一个一对一的关系文件 - > 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



Answer 2:

我要提出一个不同的做法,即使它是一种比较旧的问题。 而不是使两个实体的,你应该进行三次。

创建FileMetadata,其持有的名字,MIME类型等创建FileContent,其中包含的内容。 然后,创建持有与其它各类型之一的一到一个连接第三个实体文件,并给它一堆去调用子实体匹配方法的方法。

因此,例如在文件中,该方法的setName是这样的:

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

并设置是这样的:

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

文件实体的构造应该创建一个新的FileMetadata并创建一个新的FileContent,应该不会有setFilemetadata或setFilecontent方法; 这两个实体应该从你的应用程序被完全屏蔽。

现在你有这仍然是整齐地存放在两个(当然,三真)不同的表文件实体,它处理完全像你想要的(一个单一的实体,没有其他子实体)。



Answer 3:

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



文章来源: How to save one Doctrine entity to two database tables (required for MySQL optimisation)