2016-08-25 29 views
-3

数時間をかけて理解しようとすると、概念を明確にすることができません。示すように、Iは、3つのエンティティを定義している:Doctrineエンティティの関係混乱

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

問題は、プロファイラが言うことです:

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 \エンティティのフィールドのregion_id \都市は存在する!!

提案がありますか?

EDITED: RafixとAlvinのコンセプトに感謝します。私はDoctrine/Symfonyといくつかの時代の新人です...

実際に私がしたいのは、SelectにCountryTypeフィールドを持つselectを使用することです。それはcode_2aを値として使用することです。

私のエンティティでは、user_profileのように、エンティティのCountryに「code_2a」、OneToOneというフィールド国を設定し、Regionエンティティでこのフィールドを使用します。つまり、Countryエンティティは、Region Entityを指すフィールド 'code_2a' OneToManyを持ちます。これは、 'code_2a' ManyToOneがCountryに戻ることを意味します。彼らは 'イド'ではないので、私はそれをどうやって行うのだろう。それを行う方法を示す例はありません。

答えて

0

クラスは以下のように作成できます。 これは@rafixの答えに基づいていますが、いくつかの問題がありました。

また、にはがありますが、@rafixのようにあなたのクラス名を単数で指定することはできません。しかし、そのようにしてコードを読みやすく、サポートしやすくすることは、実用的な方がはるかに優れています。

例:「国」と呼ばれるクラスがある場合、国に「都市」があり、その「都市」のそれぞれが「都市」であることがわかります。したがって、クラスは個々のオブジェクトを参照します。ここで

は、私が提案する変更である:あなたが知っているので、

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"として宣言する必要があります。コードを完了したら、配列に領域を追加するには、適切ながあることを確認してください。

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

あなたのコードでは、Cityエンティティの属性$ regionに列定義がありませんか?地域の$ countryと同じです。それはタイプミスですか? アソシエーションAppBundle \ Entity \ Region#citiesは、関連付けとして定義されていないが、フィールドとして所有サイドフィールドAppBundle \ Entity \ City#regionを参照しています。 アソシエーションAppBundle \ Entity \ Region#citiesは、存在しない所有サイドフィールドAppBundle \ Entity \ City#regionを参照します。 – Carlos

+0

今、私は、私のエラー、おかげで、rafixを参照してください。あなたはタイプミスをしていません。 M-t-O列はJoinColumnでなければなりません。これがキーです。お役に立てれば。 – Carlos