2013-08-07 47 views
1

我想以更新vtiger_crmentity.crmid becase的它檢索vtiger_crmentity_seqid值不auto_incrementDoctrine2 + Symfony2的序列ID表

所以這是我的實體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返回此錯誤。

操作 '學說\ DBAL \平臺\ AbstractPlatform :: getSequenceNextValSQL' 是 不被平臺所支持。 500內部服務器錯誤 - DBALException

我不能改變vtiger_crmentity.crmidauto_increment所以這一想法discarted,也是我需要更新vtiger_crmentity_seq.id到明顯使用了最新的價值...

回答

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; 
... 
+0

這個ID設置爲調用構造函數還是持久化/更新實體? –

+0

都沒有,它在prePersist事件之後被調用 –

4

主義不使用SEQUENCE不支持在使用MySQL時使用GeneratedValue策略。如果您不能將列設置爲auto_increment,則必須在您自己的代碼中生成ID。見here

+0

謝謝您的回答,我也正在找你說的頁面,但我不知道怎樣才能生成自己的代碼的ID ...我認爲當TableGenerator被支持時它會很有用,但是現在,我有點失落:/ –

+0

作爲一種解決方法,您可以將策略設置爲「NONE」並生成自己的ID,如下所示:http:// docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/sharding.html#table-generator –

+0

但實際上沒有任何方法可以處理任何事情的'nextValue',我的意思是,我可以處理的唯一方法所有這一切都是我現在正在做的事情是:'$ id = QueryTableSeq-> getId'然後在插入時執行'QueryTableSet-> DoSomeQueryForIdField($ id + 1)'和'MyData-> setId($ id)' –