Symfony 2引用的列名称id必须是主键列

时间:2016-11-11 10:47:48

标签: entity-framework symfony doctrine

我没有找到合适的答案,我在这里发帖。虽然这条消息没什么意义,因为这里没有名为id的引用列。

我引用了现有的OpenCart 1.5数据库,但其中包含了与Symfony 2 CRM特定的其他实体。在这种情况下,映射是非常棘手的,但有一个我无法弄清楚。

  
      
  • 引用的列名称' id'必须是目标实体类的主键列' AppBundle \ Entity \ Oc49Language'。
  •   

Oc49Language是一个现有的OpenCart实体,但没有名为id的列,只有language_id - 并且实体本身没有提及id,也没有任何映射。< / p>

这是Oc49Language实体:

/**
 * Oc49Language
 *
 * @ORM\Table(name="oc49_language", indexes={@ORM\Index(name="name", columns={"name"})})
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\Oc49LanguageRepository")
 */
class Oc49Language
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=32, nullable=false)
     */
    private $name;

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

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

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

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

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

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

    /**
     * @var boolean
     *
     * @ORM\Column(name="status", type="boolean", nullable=false)
     */
    private $status;

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="\AppBundle\Entity\Species", inversedBy="languageName")
     */
    private $species;

    /**
     * @var integer
     *
     * @ORM\Column(name="language_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $languageId;


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->species = new ArrayCollection();
    }
.... etc.

在尝试验证时,我还在控制台中看到了ORMException消息:

  

为来自的关系引用的列名id   AppBundle \ Entity \ Oc49Language朝向AppBundle \ Entity \ Species   不存在。

这是真的 - 它不存在;但也没有提及它!

我错过了一些非常明显的东西,还是有点复杂的东西?这是我试图解决的所有问题中的最终映射错误,但这个错误让我感到困惑,所以任何帮助都会受到赞赏。

编辑:根据要求,这是物种实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Species
 *
 * @ORM\Table(name="species")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\SpeciesRepository")
 */
class Species
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=45, nullable=true)
     */
    private $name;

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

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

    /**
     * @var \AppBundle\Entity\Oc49Language
     *
     * @ORM\OneToMany(targetEntity="\AppBundle\Entity\Oc49Language", mappedBy="species")
     */
    private $languageName;

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

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Breed", mappedBy="species" )
     */
    private $breed;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Pet", inversedBy="species" )
     */
    private $pet;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Illness", mappedBy="species")
     */
    private $illness;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->breed = new ArrayCollection();
        $this->pet = new ArrayCollection();
        $this->illness = new ArrayCollection();
    }

    ...
}

1 个答案:

答案 0 :(得分:0)

每个实体类都必须有一个主键。

您可以使用@Id注释选择用作标识符的字段。

参考:http://docs.doctrine-project.org/en/latest/reference/basic-mapping.html#identifiers-primary-keys

修改 在Species实体中,替换:

     /**
     * @var \AppBundle\Entity\Oc49Language
     *
     * @ORM\OneToMany(targetEntity="\AppBundle\Entity\Oc49Language", mappedBy="species")
     */
    private $languageName;

使用:

     /**
     * @var \AppBundle\Entity\Oc49Language
     *
     * @ORM\OneToMany(targetEntity="\AppBundle\Entity\Oc49Language", mappedBy="species")
     * @ORM\JoinColumn(name="language_id", referencedColumnName="languageId")
     */
    private $languageName;