Symfony原则的延迟加载特性

时间:2018-11-22 14:29:16

标签: php symfony doctrine-orm symfony4

我有一个实体,将大文件作为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?

1 个答案:

答案 0 :(得分:0)

根据我对问题的评论-做到不中断迁移的方法是利用主义的能力来懒惰表之间的加载关系。

基本上,我必须去创建一个仅容纳巨型blob的新实体,然后在原始实体和blob实体之间建立一对一的关系。

然后我将该关系设置为加载EXTRA_LAZY,因此,我现在可以控制何时精确加载巨型数据的blob。

从规范化数据库设计的角度来看,我认为这不是理想的选择,但是它比其他任何对此感到满意的工具都好。