Symfony学说的懒惰负载特性



我有一个实体,它将大文件作为Blob存储到DB中。

我现在想让Symfony永远不要加载这些Blob,除非我通过适当的getter特别请求它们。

本质上,我想要与懒惰加载关系相同的想法,但对于字符串属性。

到目前为止,我所尝试的是将保存文件元数据的所有其他属性放入一个特征中,然后将该特征应用于两个实体。

namespace AppEntityTraits;
use DoctrineORMMapping as ORM;
trait DocumentMetaData
{
/**
* @var int|null
*
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var DateTime|null
*
* @ORMColumn(type="datetime")
*/
private $date_uploaded;
}

一个实体除了特征之外什么都没有。。。

namespace AppEntity;
use AppEntityTraitsDocumentMetaData;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="documents")
* @ORMEntity()
*/
class Document
{
use DocumentMetaData;
}

另一个添加了blob属性:

namespace AppEntity;
use AppEntityTraitsDocumentMetaData;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(name="documents")
* @ORMEntity()
*/
class DocumentFile
{
use DocumentMetaData;
/**
* @var string|null
*
* @ORMColumn(type="blob")
*/
private $blob;
}

现在,如果我不想加载blob,例如对于文件列表,我只需使用没有blob的实体。

这种方法在某种程度上起作用,但由于我需要将两个实体指向同一个表(请参阅类级别的ORM注释(,因此会引起问题。

具体来说,当运行迁移时,它会让条令变得异常:

名为"myapp.documents"的表已存在。

这很有道理,我真的希望有人能给我一个更好的解决方案。

我如何告诉条令除非明确要求,否则不要加载blob?

因此,根据对我的问题的评论,要做到这一点,迁移不会中断,就要利用条令的能力来延迟加载表之间的关系。

基本上,我必须创建一个新的实体,只容纳我的巨大斑点,然后在原始实体和斑点实体之间建立一对一的关系。

然后,我将该关系设置为加载EXTRA_LAZY,因此,我现在可以控制何时准确地加载大量数据。

我认为这在规范DB设计方面并不理想,但它比其他任何东西都要好得多。

相关内容

  • 没有找到相关文章

最新更新