У меня есть объект, который хранит большие файлы как капли в БД.
Теперь я хотел бы, чтобы 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.
В этом есть смысл, и я действительно надеюсь, что кто-нибудь подскажет мне более хорошее решение.
Как я могу сказать доктрине, чтобы она не загружала большой двоичный объект, если это явно не запрошено?
Я не думаю, что в моем случае можно отказаться от ORM, но новый табличный подход звучит интересно. Не могли бы вы рассказать о @Cerad? Я предполагаю, что вы хотите сохранить его как отношения «один к одному», а не непосредственно в основной сущности?
Ничего загадочного. Сделайте себе объект DocumentMetaData со свойством id, а также свойством blob. Затем свяжите его с вашей сущностью Document. Вы даже можете явно установить LAZY_LOAD для ассоциаций, чтобы убедиться, как они загружаются, даже если по умолчанию будет использоваться ленивая загрузка. Это все в документации.
Отлично, спасибо @Cerad. Если вы хотите добавить ответ, я буду счастлив отметить его.






Итак, согласно комментариям к моему вопросу - способ сделать это, чтобы миграции не прерывались, - это использовать способность доктрины к ленивой загрузке отношений между таблицами.
По сути, мне пришлось создать новую сущность, которая содержит только мои гигантские капли, а затем установить связь один к одному между исходной сущностью и сущностью капли.
Затем я установил это отношение для загрузки EXTRA_LAZY, и в результате теперь я могу контролировать, когда именно должны быть загружены большие двоичные объекты данных.
Я не думаю, что это идеальный вариант с точки зрения нормализации дизайна БД, но он работает намного лучше, чем что-либо еще, так что я доволен этим.
Переместите blob в его собственную таблицу / объект. Или не используйте ORM.