获取blob类型的Doctrine实体属性只返回一次数据


Getting blob type Doctrine entity property returns data only once

我使用Doctrine在数组中存储选项/各种奇数数据位,并将其串行化到数据库中,在那里它被存储为blob。直到今天,一切都很好,我不得不两次得到那个数组,并注意到它只有第一次得到正确的值。任何连续的尝试都会返回false,这就是unserialize/stream_get_contents在失败时返回的结果。

我的最佳猜测是,条令在获取数据后关闭流,但它没有多大意义。我需要在整个请求过程中提供数据。我不是流媒体专家,所以:

如何多次获取blob数据或阻止流关闭

条令实体及其方法:

/**
 * @var resource
 *
 * @ORM'Column(name="options", type="blob")
 */
private $options;
/**
 * Set options
 *
 * @param array $options
 *
 * @return Campaign
 */
public function setOptions($options)
{
    $this->options = serialize($options);
    return $this;
}
/**
 * Get options
 *
 * @return array
 */
public function getOptions()
{
    return unserialize(stream_get_contents($this->options));
}

检索序列化选项数组:

$campaign   = $this->em->getRepository('TreasureForgeMessageBundle:Campaign')->find(1);
$options1   = $campaign->getOptions(); // Correct options array
$options2   = $campaign->getOptions(); // false
$options3   = $campaign->getOptions(); // false

非常感谢!

您遇到的问题是因为您在读取操作之间没有倒带()句柄。

但是,考虑到性能,在每次访问时取消选项数组的序列化是个坏主意。每次访问时都必须将$options字符串转换为数组。相反,您应该告诉条令$options是一个数组,只有当数据从数据库中读取和写入数据库时,它才会自动序列化和非序列化:

/**
 * @var array
 *
 * @ORM'Column(name="options", type="array")
 */
private $options;
/**
 * Set options
 *
 * @param array $options
 *
 * @return Campaign
 */
public function setOptions($options)
{
    $this->options = $options;
    return $this;
}
/**
 * Get options
 *
 * @return array
 */
public function getOptions()
{
    return $this->options;
}

更新:

这里描述了条令数组类型。