我有一个实体,将大文件作为blob存储到数据库。
我现在想让Symfony永远不要加载这些blob,除非我通过适当的getter专门请求它们。
从本质上讲,我希望与延迟加载关系具有相同的概念,但需要一个字符串属性。
到目前为止,我一直在尝试将保存文件元数据的所有其他属性放入特征,然后将该特征应用于两个实体。
namespace App\Entity\Traits;
use Doctrine\ORM\Mapping as ORM;
trait DocumentMetaData
{
/**
* @var int|null
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime|null
*
* @ORM\Column(type="datetime")
*/
private $date_uploaded;
}
一个实体除了特质外什么都没有...
namespace App\Entity;
use App\Entity\Traits\DocumentMetaData;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="documents")
* @ORM\Entity()
*/
class Document
{
use DocumentMetaData;
}
...另一个具有添加的blob属性:
namespace App\Entity;
use App\Entity\Traits\DocumentMetaData;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="documents")
* @ORM\Entity()
*/
class DocumentFile
{
use DocumentMetaData;
/**
* @var string|null
*
* @ORM\Column(type="blob")
*/
private $blob;
}
现在,如果我不希望加载blob(例如,用于列出文件),我只使用没有blob的实体。
这种方法行之有效,但由于我需要将两个实体都指向同一张表而导致问题(请参阅类级别的ORM注释)。
特别是,它在运行迁移时使学说变得怪异:
名称为“ myapp.documents”的表已经存在。
这完全有道理,我真的希望有人可以为我提供更好的解决方案。
我如何告诉学说除非明确要求,否则不要加载blob?
答案 0 :(得分:0)
根据我对问题的评论-做到不中断迁移的方法是利用主义的能力来懒惰表之间的加载关系。
基本上,我必须去创建一个仅容纳巨型blob的新实体,然后在原始实体和blob实体之间建立一对一的关系。
然后我将该关系设置为加载EXTRA_LAZY,因此,我现在可以控制何时精确加载巨型数据的blob。
从规范化数据库设计的角度来看,我认为这不是理想的选择,但是它比其他任何对此感到满意的工具都好。