Doctrine - 不在数据库中创建Relation

时间:2016-11-23 09:38:10

标签: php symfony doctrine

我正在与Symfony和Doctrine合作。 通过控制台命令Array ( [0] => WEEK 47 [1] => WEEK 48 [2] => WEEK 49 [3] => WEEK 50 [4] => WEEK 51 ) 创建架构时,它不会创建我想要的关系。

两个课程:

候选人 ORM实体类:

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;
    }
}

config.yml 中的doctrine配置部分如下所示:

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;
    }
}

应该创建的关系在PHPMyadmin或MySQL Workbench中不可见。

3 个答案:

答案 0 :(得分:1)

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

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

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

投票* @ORM\Id

的实体
  

的appbundle \库\数据\投票

    /**
     * @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;

答案 1 :(得分: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以查看教义是否知道关系

答案 2 :(得分:0)

每个表的ID列的属性名称为$nID,但必须为$id

我还删除了与@ORM\Column(type="integer")主键@ORM\ManyToOne(targetEntity="Class", inversedBy="ID")关系的每个媒体资源上方的ID条评论。