Doctrine orm 理论实体关系混乱

Doctrine orm 理论实体关系混乱,doctrine-orm,symfony,Doctrine Orm,Symfony,经过几个小时的努力,我无法理解这个概念。我有三个实体的定义如下所示: class Countries { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string *

经过几个小时的努力,我无法理解这个概念。我有三个实体的定义如下所示:

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

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

    /**
     * @ORM\OneToMany(targetEntity="Regions", mappedBy="country_id")
     */
    private $regions_in_country;

    /**
     * @ORM\OneToMany(targetEntity="Cities", mappedBy="country_id")
     */
    private $cities_in_country;

    public function __construct() {
        $this->regions_in_country= new ArrayCollection();
        $this->cities_in_country= new ArrayCollection();
    }
}
问题是探查器说:

AppBundle\Entity\Regions    

The association AppBundle\Entity\Regions#cities_in_region refers to
the owning side field AppBundle\Entity\Cities#region_id which does not exist.
但是AppBundle\Entity\Cities中的字段区域\u id存在

有什么建议吗

编辑: 感谢拉菲克斯和阿尔文的概念。我是一个新的信条/符号,有时

事实上,我想做的是在表单中使用带有CountryType字段的select,问题是它使用code_2a作为值


在我的实体中,如user_profile,我将有一个带有“code_2a”的字段国家,一个指向实体国家,然后在区域实体中使用此字段。这意味着国家实体将有一个字段“code_2a”一个域,指向区域实体,该区域实体将有一个“code_2a”多个域,该域指向国家。因为它们不是“id”,我想知道怎么做。没有示例说明如何执行此操作。

您可以避免实体字段中的Id后缀,并且必须以单数形式命名实体类

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

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

   /**
   * @ORM\OneToMany(targetEntity="Region", mappedBy="country")
   */
   private $regions;

   public function __construct() {
       $this->regions = new ArrayCollection();

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

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="regions")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     */
     private $country;

    /**
     * @ORM\OneToMany(targetEntity="City", mappedBy="region")
     */
    private $cities;

    public function __construct() {
        $this->cities = new ArrayCollection();
    }
}
class City
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Region", inversedBy="cities")
     * @ORM\JoinColumn(name="region_id", referencedColumnName="id")
     */
    private $region;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;
}

这些类可以像下面的示例一样创建。 我是根据@rafix的答案得出这个结论的,但是有一些问题

此外,您不必像@rafix那样用单数命名类,您可以随意命名它们。但是,这样做更好,并且使代码更易于阅读和支持

例如:如果你有一个叫做Country的类,那么你知道一个国家有城市,每个城市都是一个城市。因此,类引用单个对象

以下是我的建议:

class Country
{
    /**
     * @ORM\Column(name="country_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
   private $country_id;

    /**
     * @ORM\Column(name="flag", type="string", length=100, nullable=true)
     */
    private $flag;

   /**
    * @ORM\OneToMany(targetEntity="Region", mappedBy="country")
    */
   private $regions = null;

   public function __construct() {
       $this->regions = new ArrayCollection();

   }
}
注意,我重命名了每个类中的每个id,以便您知道它是该特定实体的id。例如:Country类有一个Country\u id


此外,由于例如Country类具有regions,因此需要将数组声明为null。完成代码时,请确保有适当的addRegion将区域添加到数组中。

是否可能在代码中,城市实体中的属性$region没有列定义?。该地区的$country也是如此。是打字错误吗?。根据I get列的定义:association AppBundle\Entity\Regioncities指的是拥有方字段AppBundle\Entity\Cityregion,它没有定义为association,而是定义为field。关联AppBundle\Entity\Regioncities引用了不存在的拥有方字段AppBundle\Entity\Cityregion。现在我看到了我的错误,谢谢修复。不,你没有输入错误。M-t-O列必须是JoinColumn,这是关键。希望这有帮助。
class Country
{
    /**
    * @var int
    *
    * @ORM\Column(name="id", type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
   private $id;

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

   /**
   * @ORM\OneToMany(targetEntity="Region", mappedBy="country")
   */
   private $regions;

   public function __construct() {
       $this->regions = new ArrayCollection();

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

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="regions")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     */
     private $country;

    /**
     * @ORM\OneToMany(targetEntity="City", mappedBy="region")
     */
    private $cities;

    public function __construct() {
        $this->cities = new ArrayCollection();
    }
}
class City
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\ManyToOne(targetEntity="Region", inversedBy="cities")
     * @ORM\JoinColumn(name="region_id", referencedColumnName="id")
     */
    private $region;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;
}
class Country
{
    /**
     * @ORM\Column(name="country_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
   private $country_id;

    /**
     * @ORM\Column(name="flag", type="string", length=100, nullable=true)
     */
    private $flag;

   /**
    * @ORM\OneToMany(targetEntity="Region", mappedBy="country")
    */
   private $regions = null;

   public function __construct() {
       $this->regions = new ArrayCollection();

   }
}
class Region
{
    /**
     * @ORM\Column(name="region_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $region_id;

    /**
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="regions")
     * @ORM\JoinColumn(name="region_country_id", referencedColumnName="country_id")
     */
    private $country;

    /**
     * @ORM\OneToMany(targetEntity="City", mappedBy="region")
     */
    private $cities = null;

    public function __construct() {
        $this->cities = new ArrayCollection();
    }
}
class City
{
    /**
     * @ORM\Column(name="city_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $city_id;

    /**
     * @ORM\ManyToOne(targetEntity="Region", inversedBy="cities")
     * @ORM\JoinColumn(name="region_id", referencedColumnName="region_id")
     */
    private $region;

    /**
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;
}