Php 条令-未在数据库中创建关系

Php 条令-未在数据库中创建关系,php,symfony,doctrine,Php,Symfony,Doctrine,我在和Symfony和Doctrine合作。 当通过console命令php-bin/console-doctor:schema:update--force创建模式时,它不会创建我希望它创建的关系 两类: 候选对象ORM实体类: namespace AppBundle\Libraries\Data; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="candidates") */ class Ca

我在和Symfony和Doctrine合作。 当通过console命令
php-bin/console-doctor: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;
    }
}
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;
    }
}
投票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;
    }
}
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中不可见。

即使您已将这些实体放置在Symfony期望的非标准目录中,您也已通过设置自定义映射正确配置了ORM

问题似乎是由于投票实体中缺少主键

每个实体必须有一个标识符/主键

使用
*@ORM\Id

AppBundle\Libraries\Data\Voces

编辑: 这是我运行时得到的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;
请尝试以下操作:

候选实体

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
,查看doctrine是否知道这种关系

每个表的ID列都有属性名
$nID
,但必须是
$ID


我还删除了每个属性上方的
@ORM\Column(type=“integer”)
注释,该注释带有
@ORM\manytone(targetEntity=“Class”,inversedBy=“ID”)
ID
主键的关系。

是否启用了条令元数据缓存?@Vamsi我没有专门启用任何东西,这是否在配置中?是否有任何错误或只是没有创建任何内容?什么是输出命令php bin/console原则:schema:update--dump sql?@Thomas控制台不显示任何错误,输出:
无需更新-您的数据库已与当前实体元数据同步。
为什么不尝试使用auto_mapping=true并删除配置的“mappings”部分?我添加了一个ID列,但是关系仍然不存在。你清除缓存了吗?php应用程序/控制台缓存:清除和php应用程序/控制台原则:缓存:清除元数据没有帮助,没有创建关系您可以运行php应用程序/控制台原则:映射:信息并检查是否所有实体都显示了吗?我还在上面的答案中添加了SQL。它应该显示实体的FQCN。。如果它显示您期望的所有实体名称,那么如果使用或不使用自定义映射,则无需担心。。您是否还检查了“``php应用程序/控制台原则:架构:验证”``这会引发一个错误:
[doctrine\ORM\ORMException]列名
id`从AppBundle\Libraries\Data\voces到AppBundle\Libraries\Data\候选者的关系中引用。`当我运行控制台命令时。当我在关系上方添加
@ORM\Column(type=“integer”)
时,它会识别更改,但不会创建关系。