Doctrine2 + Symfony2序列ID表

时间:2013-08-07 11:26:39

标签: php mysql symfony doctrine-orm

我正在尝试从id检索vtiger_crmentity_seq值,以便更新vtiger_crmentity.crmid,因为它不是auto_increment

所以这是我的实体vtiger_crmentity

/**
 * @var integer
 *
 * @ORM\Column(name="crmid", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="SEQUENCE")
 * @ORM\SequenceGenerator(sequenceName="vtiger_crmentity_seq", allocationSize=1, initialValue=1)
 */
private $crmid;

/**
 * Get crmid
 *
 * @return integer 
 */
public function getCrmid()
{
    return $this->crmid;
}

但是当我尝试提交表单时,Symfony2会返回此错误。

  

操作   'Doctrine \ DBAL \ Platforms \ AbstractPlatform :: getSequenceNextValSQL'是   平台不支持。 500内部服务器错误 - DBALException

我无法将vtiger_crmentity.crmid更改为auto_increment所以这个想法已经放弃了,我还需要将vtiger_crmentity_seq.id更新为显然使用的最新值...

2 个答案:

答案 0 :(得分:5)

您可以尝试使用自定义生成器,使用自定义生成器可以解决任何主键生成问题。

此代码在sql中调用一些本机查询,但您可以在自定义生成器中执行所有操作。

<?php

namespace MY\Doctrine;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Doctrine\ORM\Query;

class CustomGenerator extends AbstractIdGenerator
{
    static $cache = array();

    public function generate(EntityManager $em, $entity)
    {
        $id = $em->createNativeQuery(
                'SELECT crmid FROM vtiger_crmentity_seq WHERE used = 0 LIMIT 1',
                new Query\ResultSetMapping()
            )->getResult(Query::HYDRATE_SINGLE_SCALAR);
        $em->getConnection()->executeUpdate(
            'UPDATE vtiger_crmentity_seq SET used = 1 WHERE crmid = ?', 
             array($id)
        )

        return $id;
    }
}

并在您的实体中

...
class AbstractProduct
{
    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="CUSTOM")
     * @ORM\CustomIdGenerator(class="\My\CustomGenerator")
     */
    protected $id;
...

答案 1 :(得分:4)

在使用MySQL时,Doctrine不支持对SEQUENCE使用GeneratedValue策略。如果您无法将列设置为auto_increment,则必须在自己的代码中生成ID。请参阅here