我正在尝试从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
更新为显然使用的最新值...
答案 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。