在我的数据库我有一个表格file
和表格file_content
。 该file
表存储的文件的元数据,如name
, mime
和更多一些。 该file_content
存储与文件内容的斑点。 我不是存储在同一个表中的BLOB作为唯一的表现的原因的元数据。
对于我的项目的“第二版”我寻找到学说(2.3)。 在我看来,“文件”似乎是一个实体,如属性name
, mime
, extension
, content
应该像这样使用:
$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 -地图实体到多个表
有人有任何建议如何正确处理呢? 我是新来的学说,并已被玩弄了一点,看它是否对我的项目是正确的选择。 谢谢。
你必须改变你的数据库的模式的能力吗? 如果是的话,我会考虑合并到一个表这一点。
除非,你可能会想尝试学说一比一的关系。 也许是这样的:
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
我要提出一个不同的做法,即使它是一种比较旧的问题。 而不是使两个实体的,你应该进行三次。
创建FileMetadata,其持有的名字,MIME类型等创建FileContent,其中包含的内容。 然后,创建持有与其它各类型之一的一到一个连接第三个实体文件,并给它一堆去调用子实体匹配方法的方法。
因此,例如在文件中,该方法的setName是这样的:
public function setName() {
$this->getFileMetadata()->getName();
}
并设置是这样的:
public function setName( $name ) {
$this->getFileMetadata()->setName( $name );
}
文件实体的构造应该创建一个新的FileMetadata并创建一个新的FileContent,应该不会有setFilemetadata或setFilecontent方法; 这两个实体应该从你的应用程序被完全屏蔽。
现在你有这仍然是整齐地存放在两个(当然,三真)不同的表文件实体,它处理完全像你想要的(一个单一的实体,没有其他子实体)。
你可以映射两个表,导致File
和FileContent
,并添加两者之间的一个一对一的关系。 然后添加在该文件的内容的getter / setter方法File
类。 在这些你必须调用相应的方法FileContent
。
文章来源: How to save one Doctrine entity to two database tables (required for MySQL optimisation)