Symfony doctrine lazy load свойства

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

Теперь я хотел бы, чтобы 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 на уровне класса).

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

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

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

Как я могу сказать доктрине, чтобы она не загружала большой двоичный объект, если это явно не запрошено?

Переместите blob в его собственную таблицу / объект. Или не используйте ORM.

Cerad 22.11.2018 15:45

Я не думаю, что в моем случае можно отказаться от ORM, но новый табличный подход звучит интересно. Не могли бы вы рассказать о @Cerad? Я предполагаю, что вы хотите сохранить его как отношения «один к одному», а не непосредственно в основной сущности?

Bananaapple 22.11.2018 15:49

Ничего загадочного. Сделайте себе объект DocumentMetaData со свойством id, а также свойством blob. Затем свяжите его с вашей сущностью Document. Вы даже можете явно установить LAZY_LOAD для ассоциаций, чтобы убедиться, как они загружаются, даже если по умолчанию будет использоваться ленивая загрузка. Это все в документации.

Cerad 22.11.2018 15:52

Отлично, спасибо @Cerad. Если вы хотите добавить ответ, я буду счастлив отметить его.

Bananaapple 22.11.2018 15:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 594
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме