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

Vig*_*jis 1 php doctrine symfony doctrine-orm

我使用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));
}
Run Code Online (Sandbox Code Playgroud)

检索序列化选项数组:

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

非常感谢!

and*_*ndy 6

您遇到的问题是因为您没有在读取操作之间回放()您的句柄.

但是,考虑到性能,在每次访问时反序列化选项数组是一个坏主意.$options在每次访问时,必须将字符串转换为数组.相反,您应该告诉doctrine $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;
}
Run Code Online (Sandbox Code Playgroud)

更新:

这里描述 Doctrine数组类型.

  • 你是个天才!添加`rewind($ this-> options);`就在返回unserialize之前(stream_get_contents($ this-> options));`修复它.我把头发拉了出来! (2认同)