经过几个小时试图理解我无法理解这个概念。我有三个实体定义如下:
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'我想知道该怎么做。没有例子可以说明如何做到这一点。
答案 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
区域添加区域。