2016-11-23 129 views
1

我正在使用Symfony和Doctrine。 當架構通過控制檯命令php bin/console doctrine:schema:update --force創建時,它不會創建我想要的關係。學說 - 未在數據庫中創建關係

兩類:

考生 ORM實體類:

namespace AppBundle\Libraries\Data; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="candidates") 
*/ 
class Candidates 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    * @ORM\OneToMany(targetEntity="AppBundle\Libraries\Data\Votes", mappedBy="nCandidate") 
    */ 
    private $nID; 

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

投票 ORM實體類:

namespace AppBundle\Libraries\Data; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="votes") 
*/ 
class Votes 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    */ 
    private $nID; 

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\ManyToOne(targetEntity="AppBundle\Libraries\Data\Candidates", inversedBy="nID") 
    */ 
    private $nCandidate; 

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

    /** 
    * Set nCandidate 
    * 
    * @param integer $nCandidate 
    * 
    * @return Votes 
    */ 
    public function setNCandidate($nCandidate) 
    { 
     $this->nCandidate = $nCandidate; 

     return $this; 
    } 

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

學說配置部分中config.yml外觀像這樣:

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver: pdo_mysql 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 
     charset: UTF8 
     # if using pdo_sqlite as your database driver: 
     # 1. add the path in parameters.yml 
     #  e.g. database_path: "%kernel.root_dir%/data/data.db3" 
     # 2. Uncomment database_path in parameters.yml.dist 
     # 3. Uncomment next line: 
     #  path:  "%database_path%" 

    orm: 
     auto_generate_proxy_classes: "%kernel.debug%" 
     naming_strategy: doctrine.orm.naming_strategy.underscore 
     auto_mapping: false 
     mappings: 
      FOSUserBundle: ~ 
      AppBundle: 
       type: annotation 
       dir: "%kernel.root_dir%/../src/AppBundle/Libraries/Data" 
       prefix: AppBundle\Libraries\Data 

應該創建的關係在PHPMyadmin或MySQL Workbench中不可見。

+0

是啓用了Doctrine元數據緩存嗎? – Vamsi

+0

@Vamsi我沒有特別啓用任何東西,這是在配置? – Orlando

+0

你有沒有得到任何錯誤或只是沒有創建?輸出命令是什麼php bin/console doctrine:schema:update --dump-sql? – Thomas

回答

0

每個表的ID列有屬性名$nID的,但它必須是$id

我還刪除了@ORM\Column(type="integer")評論上面的每個屬性與@ORM\ManyToOne(targetEntity="Class", inversedBy="ID")關係ID主鍵。

1

即使你已經在正確的Symfony期待,你已經配置學說ORM通過設置自定義映射非標準目錄放置這些實體..

問題似乎是因爲缺乏在票數主鍵實體。

每個實體都必須有一個標識符/主鍵。與* @ORM\Id

AppBundle\Libraries\Data\Votes

/** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @return mixed 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * @param mixed $id 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
    } 

編輯

投票實體: 這是我得到的SQL(MySQL的)當我運行

php app/console doctrine:schema:update --dump-sql 

CREATE TABLE candidates (
    n_id INT AUTO_INCREMENT NOT NULL 
    ,PRIMARY KEY (n_id) 
    ) DEFAULT CHAR 

SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 

CREATE TABLE votes (
    id INT AUTO_INCREMENT NOT NULL 
    ,n_candidate INT NOT NULL 
    ,PRIMARY KEY (id) 
    ) DEFAULT CHAR 

SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
+0

我添加了一個ID列,但關係仍然沒有邏輯 – Orlando

+1

你清除了緩存嗎? PHP應用程序/控制檯高速緩存:明確和PHP應用程序/控制檯學說:緩存:明確的元數據 – Vamsi

+0

沒有幫助,關係不產生 – Orlando

0

嘗試以下操作:

候選實體

namespace AppBundle\Libraries\Data; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="candidates") 
*/ 
class Candidates 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    */ 
    private $nID; 

    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Libraries\Data\Votes", mappedBy="candidate") 
    */ 
    private $vote; 

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

投票實體

namespace AppBundle\Libraries\Data; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="votes") 
*/ 
class Votes 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @ORM\Column(type="integer") 
    */ 
    private $nID; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    private $nCandidate; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Libraries\Data\Candidates", inversedBy="vote") 
    */ 
    private $candidate; 
    /** 
    * Get nID 
    * 
    * @return integer 
    */ 
    public function getNID() 
    { 
     return $this->nID; 
    } 

    /** 
    * Set nCandidate 
    * 
    * @param integer $nCandidate 
    * 
    * @return Votes 
    */ 
    public function setNCandidate($nCandidate) 
    { 
     $this->nCandidate = $nCandidate; 

     return $this; 
    } 

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

然後運行php bin/console doctrine:schema:update --dump-sql,看是否學說是知道的關係

+0

這會引發一個錯誤:'[Doctrine \ ORM \ ORMException]從AppBundle \ Libraries \數據\投票AppBundle \ Libraries \ Data \ Candidates不存在.'當我運行控制檯命令。當我在關係之上添加'@ORM \ Column(type =「integer」)'時,它會識別更改,但不會創建關係。 – Orlando