Symfony 延迟加载属性

Symfony doctrine lazy load properties

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

这种方法有点管用,但会导致问题,因为我需要将两个实体指向同一个 table(请参阅 class 级 ORM 注释)。

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

The table with name 'myapp.documents' already exists.

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

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

因此,根据对我的问题的评论 - 执行此操作以使迁移不中断的方法是利用学说的能力来延迟加载表之间的关系。

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

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

我不认为这在数据库设计规范化方面是理想的,但它比其他任何对此感到满意的东西都要好得多。