学说实体关系令人困惑

时间:2016-08-25 12:00:20

标签: doctrine-orm symfony

经过几个小时试图理解我无法理解这个概念。我有三个实体定义如下:

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();
    }
}
class Regions
{
    /**
     * @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\Column(name="country_id", type="integer")
     * @ORM\ManyToOne(targetEntity="Countries", inversedBy="regions")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     */
    private $countryId;

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

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

    /**
     * @var int
     *
     * @ORM\Column(name="country_id", type="integer")
     * @ORM\ManyToOne(targetEntity="Countries", inversedBy="cities_in_country")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     */
    private $countryId;

    /**
     * @var int
     *
     * @ORM\Column(name="region_id", type="integer")
     * @ORM\ManyToOne(targetEntity="Regions", inversedBy="cities_in_region")
     * @ORM\JoinColumn(name="region_id", referencedColumnName="id")
     */
    private $regionId;

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

问题在于Profiler说:

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中的field_id字段存在!!

有什么建议吗?

编辑: 感谢Rafix和Alvin的概念。我是Doctrine / Symfony的新手,有时候......

实际上我想要做的是在表单中使用带有CountryType字段的select,就是它使用code_2a作为值。

在我的实体中,例如user_profile,我将有一个字段国家/地区,其中包含' code_2a',OneToOne到实体国家/地区,然后在Region实体中使用此字段。这意味着国家/地区实体将拥有一个字段' code_2a' OneToMany指向Region Entity,它将包含一个' code_2a' ManyToOne逆转国家。因为他们不是' id'我想知道该怎么做。没有例子可以说明如何做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以避免实体字段中的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;
}

答案 1 :(得分:0)

可以像下面的示例一样创建类。 我基于@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();

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

注意,我重命名了每个" id"在每个类中,您将知道它是该特定实体的ID。例如:Country类有一个" country_id"。

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