Учение Symfony о ленивой нагрузке - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть объект, который хранит большие файлы в виде больших двоичных объектов в БД.

Теперь я бы хотел, чтобы Symfony никогда не загружал эти большие двоичные объекты, если я специально не запрашиваю их через соответствующий метод получения.

В сущности, мне нужна та же идея, что и для отношений отложенной загрузки, но для строкового свойства.

До сих пор я пытался поместить все остальные мои свойства, которые содержат метаданные файла, в черту, а затемприменить эту черту к двум сущностям.

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;
}

Теперь, если я не хочу загружать большой двоичный объект, например, для вывода списка файлов, я просто использую объект, у которого нет большого двоичного объекта.

Этот подходвроде работает, но вызывает проблемы, так как мне нужно указать обе сущности на одну и ту же таблицу (см. аннотации ORM уровня класса).

В частности, это приводит в замешательство доктрину при выполнении миграций:

Стол симя «myapp.documents» уже существует.

Это имеет смысл, и я действительно надеюсь, что кто-то может подсказать мне более удачное решение.

Как я могу сказать доктрине незагрузить BLOB-объект, если он явно не запрошен?

1 Ответ

0 голосов
/ 26 ноября 2018

Итак, в соответствии с комментариями к моему вопросу - способ сделать так, чтобы миграции не нарушались, - это использовать способность доктрины лениво загружать отношения между таблицами.

По сути, мне пришлось пойти и создать новыйсущность, которая содержит только мои гигантские большие двоичные объекты, а затем устанавливает отношение один к одному между исходной сущностью и сущностью большого двоичного объекта.

Затем я устанавливаю это отношение для загрузки EXTRA_LAZY и в результате могутеперь контролируйте, когда именно должны быть загружены большие объекты гигантских данных.

Я не думаю, что это идеально с точки зрения нормализации дизайна БД, но это работает намного лучше, чем все остальное, что так радует.

...