我创建了一个具有 BLOB 类型属性的 Doctrine ORM 实体:
public const MAX_BLOB_SIZE = 2097152;
#[ORM\Column(name: 'blob', type: Types::BLOB, length: self::MAX_BLOB_SIZE, nullable: FALSE)]
private $_blob;
public function setBlobStream($blob) : void {
if (!is_resource($blob)) {
throw new \InvalidArgumentException('Expected a resource, got ' . gettype($blob));
}
$this->_blob = $blob;
}
当设置此字段并使用实体管理器保留此对象时,我总是收到语法错误:
$asset->setBlobStream($uploads['payload']->getStream()->detach());
$em->persist($asset);
$em->flush();
// An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'blob = '????\\0\u0010JFIF\\0\u0001\u0001\u0001\\0H\\0H\\0\\0??\\0C\...
我确实弄清楚的一件事是 DBAL 学说有一个特定的参数类型,您应该指定用于存储大型对象(
\Doctrine\DBAL\ParameterType::LARGE_OBJECT
),但我似乎无法弄清楚我是否需要和/或可以为 ORM 指定它.
有什么建议吗?
我终于自己发现了问题。
看来(正如之前的用户评论并不幸删除的那样)列名
blob
是问题所在。我认为该学说不会使用 MySQL 适配器的反引号来转义列名称。