我使用Doctrine在数组中存储选项/奇数数据的各个位,并将其序列化到数据库,然后将其存储为blob。一切都工作正常,直到今天我必须得到两次数组,并注意到它只是第一次得到正确的值。任何连续的尝试都会返回false,这就是unserialize / stream_get_contents失败时返回的内容。
我最好的猜测是,在获取数据后,doctrine会关闭流,但这没有多大意义。我需要在整个请求中提供数据。我不是溪流的专家所以:
如何多次获取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
非常感谢!
答案 0 :(得分:6)
您遇到的问题是因为您在读取操作之间没有rewind()处理。
但是,考虑到性能,在每次访问时反序列化选项数组是一个坏主意。每次访问时都必须将$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;
}
<强>更新强>
Doctrine数组类型描述为here。