0

我在 Zend Framework 2 中,试图在使用 postgresql PDO 插入后获取最后插入的 id。除非我添加一个 SequenceFeature,否则插入工作正常,如下所示:

class LogTable extends AbstractTableGateway
{
    protected $table = 'log';

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
        $this->featureSet = new Feature\FeatureSet();
        $this->featureSet->addFeature(new Feature\SequenceFeature('id','log_id_seq'));
        $this->resultSetPrototype = new ResultSet();
        $this->resultSetPrototype->setArrayObjectPrototype(new Log());
        print_r($this->getFeatureSet());

        $this->initialize();
    }

当我后来做这样的插入时:

            $this->insert($data);

它失败了,因为 INSERT INTO "log" () VALUES (),所以由于某种原因 zf2 将要插入的列和值清空,但前提是我添加了该 SequenceFeature。

如果我不添加该功能,则插入工作正常,但我无法获得最后一个序列值。调试 Zend/Db/Sql/Insert.php,我发现 values 函数在 SequenceFeature 中被访问了两次,但在它不在那里时只有一次。由于某种原因,当 SequenceFeature 存在时,所有插入列和值都被清空,可能是因为这个双重调用?我还没有进一步调查,但也许它正在更新序列,然后在插入时丢失数据?

这是一个错误,还是只是我缺少一些东西?

4

1 回答 1

1

算了!我们会现场直播!

绝对不是最好的解决方案,但这有效。我只是从 Zend/Db/TableGateway/Feature/SequenceFeature.php 中剪切并粘贴了适当的代码,并将其作为函数添加到我的 LogTable 类中:

public function nextSequenceId()
{
    $sql = "SELECT NEXTVAL('log_id_seq')";
    $statement = $this->adapter->createStatement();
    $statement->prepare($sql);
    $result = $statement->execute();
    $sequence = $result->getResource()->fetch(\PDO::FETCH_ASSOC);
    return $sequence['nextval'];
}

然后我在插入我的 LogController 类之前调用​​它:

$data['id'] = $this->nextSequenceId();
$id = $this->insert($data);

瞧!希望其他人会向我解释我应该如何做,但这在此期间会很好用。

于 2013-06-14T18:43:31.933 回答