2016-04-16 49 views
0

我正在使用ZF2的Doctrine 2。名称'主'的索引已经在表'网站'上定义了

我有一个具有以下主键字段的网站实体。

/** 
* @var string 
* @ORM\Column(name="site_id", type="string", length=10, nullable=false) 
* @ORM\Id 
*/ 
private $siteId; 

及以下指标的

* @ORM\Table(name="sites", indexes={ 
* @ORM\Index(name="PRIMARY", columns={"site_id"}), 
* @ORM\Index(name="country_id", columns={"country_id"}), 
* @ORM\Index(name="timezone_id", columns={"timezone_id"}), 
* @ORM\Index(name="vat_rate_id", columns={"vat_rate_id"}), 
* @ORM\Index(name="site_mode_id", columns={"site_mode_id"}), 
* @ORM\Index(name="created_by_user_id", columns={"created_by_user_id"}), 
* }) 

当我在命令行中,我得到了以下错误消息运行php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:validate-schema

[Doctrine\DBAL\Schema\SchemaException] 
    An index with name 'primary' was already defined on table 'sites'. 

但是它也报告The mapping files are correct.

有谁知道为什么产生这个错误是什么吗?

非常感谢提前。

编辑

全部实体的要求

/** 
* Sites Entity 
* 
* @author Garry Childs 
* 
* @ORM\Table(name="sites", indexes={ 
* @ORM\Index(name="country_id", columns={"country_id"}), 
* @ORM\Index(name="timezone_id", columns={"timezone_id"}), 
* @ORM\Index(name="vat_rate_id", columns={"vat_rate_id"}), 
* @ORM\Index(name="site_mode_id", columns={"site_mode_id"}), 
* @ORM\Index(name="created_by_user_id", columns={"created_by_user_id"}), 
* }) 
* @ORM\Entity(repositoryClass="Application\Entity\Repository\SitesRepository") 
* @ORM\HasLifecycleCallbacks 
*/ 
class Sites extends AbstractEntity 
{ 

    /** 
    * @var string 
    * @ORM\Column(name="site_id", type="string", length=10, nullable=false) 
    * @ORM\Id 
    */ 
    private $siteId; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="domain_name", type="string", length=255, nullable=false) 
    */ 
    private $domainName; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=30, nullable=false) 
    */ 
    private $title; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email_address", type="string", length=254, nullable=false) 
    */ 
    private $emailAddress; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="layout", type="string", length=30, nullable=true) 
    */ 
    private $layout; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="homepage", type="string", length=30, nullable=true) 
    */ 
    private $homepage; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="bookmark_icon", type="string", length=20, nullable=false) 
    */ 
    private $bookmarkIcon = 'bookmark.png'; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="address", type="string", length=200, nullable=false) 
    */ 
    private $address; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="town", type="string", length=30, nullable=false) 
    */ 
    private $town; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="county", type="string", length=30, nullable=false) 
    */ 
    private $county; 

    /** 
    * @var \Application\Entity\Countries 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Entity\Countries") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="country_id", referencedColumnName="country_id") 
    * }) 
    */ 
    private $country; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="post_code", type="string", length=7, nullable=false) 
    */ 
    private $postCode; 

    /** 
    * @var \Application\Entity\Timezones 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Entity\Timezones") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="timezone_id", referencedColumnName="timezone_id") 
    * }) 
    */ 
    private $timezone; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="locale", type="string", length=5, nullable=false) 
    */ 
    private $locale; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="currency_code", type="string", length=3, nullable=false) 
    */ 
    private $currencyCode; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="vat_number", type="string", length=10, nullable=true) 
    */ 
    private $vatNumber; 

    /** 
    * @var \Application\Entity\VatRates 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Entity\VatRates", inversedBy="sites") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="vat_rate_id", referencedColumnName="vat_rate_id") 
    * }) 
    */ 
    private $vatRate; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_created", type="datetime") 
    */ 
    private $dateCreated; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_modified", type="datetime") 
    */ 
    private $dateModified; 

    /** 
    * @var \Application\Entity\Users 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Entity\Users") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="created_by_user_id", referencedColumnName="user_id") 
    * }) 
    */ 
    private $createdBy; 

    /** 
    * @var Doctrine\ORM\PersistentCollection 
    * 
    * @ORM\OneToMany(targetEntity="Application\Entity\Categories", mappedBy="site") 
    */ 
    private $categories; 

    /** 
    * @var \Doctrine\ORM\PersistentCollection 
    * 
    * @ORM\OneToMany(targetEntity="Application\Entity\SiteCountries", cascade="persist", mappedBy="site") 
    */ 
    private $siteCountries; 

    /** 
    * @var \Doctrine\ORM\PersistentCollection 
    * 
    * @ORM\OneToMany(targetEntity="Application\Entity\SiteShippingMethods", cascade="persist", mappedBy="site") 
    */ 
    private $shippingMethods; 

    /** 
    * @var \Doctrine\ORM\PersistentCollection 
    * 
    * @ORM\OneToMany(targetEntity="Application\Entity\SitePaymentMethods", cascade="persist", mappedBy="site") 
    */ 
    private $sitePaymentMethods; 

    /** 
    * @var \Application\Entity\SiteModes 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Entity\SiteModes") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="site_mode_id", referencedColumnName="site_mode_id") 
    * }) 
    */ 
    private $siteMode; 

    /** 
    * 
    * @var integer 
    * @ORM\Column(name="payment_days", type="integer", nullable=false) 
    */ 
    private $paymentDays; 

    /** 
    * 
    * @var integer 
    * @ORM\Column(name="products_per_page", type="integer", nullable=false) 
    */ 
    private $productsPerPage; 

    /** 
    * @var \Doctrine\ORM\PersistentCollection 
    * 
    * @ORM\OneToMany(targetEntity="Application\Entity\Invoices", mappedBy="site") 
    * }) 
    */ 
    private $invoices; 

    public function __construct() 
    { 
     $this->categories = new ArrayCollection(); 
     $this->siteCountries = new ArrayCollection(); 
     $this->shippingMethods = new ArrayCollection(); 
     $this->vatRate = NULL; 
     $this->sitePaymentMethods = new ArrayCollection(); 
     $this->invoices = new ArrayCollection(); 
     $this->productsPerPage = 15; 
    } 

    .... Getters & Setters 

    /** 
    * @ORM\PrePersist 
    * @return \Application\Entity\Users 
    */ 
    public function prePersist() 
    { 
     $this->dateCreated = $this->getCurrentDateTime(); 
     $this->dateModified = $this->getCurrentDateTime(); 
     $this->currencyCode = $this->strToUpper($this->currencyCode); 
     $this->createdBy = $this->getAuthUser(); 
     return $this; 
    } 

    /** 
    * @ORM\PreUpdate 
    * @return \Application\Entity\Users 
    */ 
    public function preUpdate() 
    { 
     $this->dateModified = $this->getCurrentDateTime(); 
     $this->currencyCode = $this->strToUpper($this->currencyCode); 
     return $this; 
    } 
+0

这是因为该名称被视为一个SQL关键字了解更多关于此in chapter 4.5. Identifiers/Primary Keys。尝试在字符串'name =“\'PRIMARY \'''' – 0x13a

+0

周围添加反引号感谢您的回复。我曾尝试反驳主要没有运气,仍然得到相同的错误。 – Garry

+0

bcz名字PRIMARY是一个MYSQL RESERVED关键字,呃你的错误有你的答案 –

回答

0

您已经标示在site_id列作为主列当您添加注释@ORM\Id$siteId财产。这是没有必要添加如下一行:

@ORM\Index(name="PRIMARY", columns={"site_id"}), 

删除了这一行,你会看到site_id列将在数据库中自动索引正确的PRIMARY指数。

学说文档

+0

我已经删除了行'* @ORM \ Index(name =“PRIMARY”,columns = {“site_id”}),'并且仍然收到相同的错误。 – Garry

+0

@Garry你能展示你的完整实体定义吗? – Wilt

+0

添加实体定义以根据请求进行提问。 – Garry

相关问题