php - Symfony 主义延迟加载属性

标签 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 注释)。

具体来说,它在运行迁移时使原则变得困惑:

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

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

我怎样才能告诉原则不要加载blob,除非它明确要求?

最佳答案

因此,根据对我的问题的评论 - 避免迁移中断的方法是利用原则延迟加载表之间关系的能力。

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

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

我认为这对于标准化数据库设计而言并不理想,但它比其他任何令人满意的东西都要好得多。

关于php - Symfony 主义延迟加载属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53433135/

相关文章:

doctrine-orm - 教义复合主键

php - 使用 Doctrine 的 Symfony2 抽象类多重继承

php - PDOStatement::bindParam data_type 参数列表

带有验证组的 Symfony 2 表单,错误映射到错误的属性?

php - 如何在包含的 SQL 查询中使用 Twig 循环值

symfony - 如何转发请求到路线名称

php - 使用 laravel 和 mysql :DataTables warning: table id=example - ajax error 的错误数据表

php - 神秘的 2012 年 2 月 10 日未设置为数组

javascript - PHP 和 AJAX 获取变量

php - 交响乐 2 : Disable Doctrine event listener in ContainerAwareCommand