2016-11-23 3 views
1

Я работаю с Symfony и Doctrine. Когда схема создается с помощью команды консоли php bin/console doctrine:schema:update --force, она не создает отношения, к которым я так хочу.Доктрина - Связь не создана в базе данных

Два класса:

Кандидаты ORM Entity Класс:

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 Entity Класс:

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

Идентификатор столбца каждой таблицы имели имя свойства $nID, но оно должно быть $id.

Я также удалил комментарий @ORM\Column(type="integer") выше каждого свойства с отношением @ORM\ManyToOne(targetEntity="Class", inversedBy="ID") к первичному ключу ID.

1

Даже если вы разместили эти Сущности в нестандартном каталоге, Symfony ожидает, настроенную Doctrine ORM правильно установив пользовательское сопоставление ..

Проблема, как представляется, из-за отсутствия первичного ключа в води Сущность.

Каждый объект должен иметь идентификатор/первичный ключ.

Votes предприятие с * @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; 
    } 

Edit: Это 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

Я добавил столбец идентификатора, но отношение все еще не – Orlando

+1

Вы очистили кеш? php app/console cache: clear и php app/console doctrine: cache: clear-metadata – Vamsi

+0

Не помогло, отношения не созданы – Orlando

0

Попробуйте следующее:

Candidate лица

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] Имя столбца' id', на которое ссылается ссылка из AppBundle \ Libraries \ Data \ Votes to AppBundle \ Libraries \ Data \ Candidates не существует. 'Когда я запускаю консольную команду. Когда я добавляю '@ORM \ Column (type =" integer ")' над отношением, он распознает изменение, но не создает отношения. – Orlando

Смежные вопросы