2012-01-12 13 views
3

私は私のプロジェクトで定義されたシンプルなエンティティの構造を有する:抽出データ

国>地域>地方>タウン、次のように定義された

class Town 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** @Column(type="string", length=30,unique=FALSE) */ 
    private $townname; 

    /** @Column(type="boolean") */ 
    private $active; 

    // so that we know when a user has added a town 
    /** @Column(type="boolean") */ 
    private $verified; 


    /** 
    * @ManyToOne(targetEntity="Province") 
    * @JoinColumn(name="provinces_id", referencedColumnName="id",nullable=FALSE) 
    */ 
    private $provinces_id; 

OK。あなたはその考えを得る。

ユーザーが町を持つ場合(多対1)、そのユーザーの地域、地域、国を知りたいと思います。私はSQLやDQLを使ってこのデータを提供する町のエンティティのためのリポジトリメソッドを作ることができました。ような何か:

SELECT `users`.`towns_id`,`towns`.`provinces_id`,`regions`.`countries_id`,`provinces`.`regions_id` FROM users , `regions` 
LEFT JOIN `towns` ON `users`.`towns_id` = `towns`.`id` 
LEFT JOIN `provinces` ON `towns`.`provinces_id` = `provinces`.`id` 

しかし、これは教義はすでに町、州、地域や国エンティティ間の関係について、「知っている」、特に以来、間違っているようです。

これを行う簡単な方法はありますか?最後に

答えて

0

私はこのようにそれをやった:

私は(これはおそらく必要ありませんが)協会の双方向を作った:

// in towns entity 
    /** 
     * @ManyToOne(targetEntity="Province", inversedBy="towns") 
     * @JoinColumn(name="provinces_id", referencedColumnName="id",nullable=FALSE) 
     */ 
     private $provinces_id; 



// in provinces entity 

/** 
    * @OneToMany(targetEntity="Town", mappedBy="towns") 
    */ 
    private $towns; 

    public function __construct() { 
     $this->towns = new ArrayCollection(); 
     $this->active = true; 
    } 

    public function getTowns() { 
     return $this->towns; 
    } 

あなたは、単にこのようなユーザーの国を参照することができます。

$user = new \Entities\User; 
$user = $this->em->getRepository('Entities\User')->findOneByFirstname('test'); 

$country=$user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname(); 
2

これらはすべて、データベースからそれらのエンティティを取得する方法によって異なります。 dbに対して送信されるSQL文を最小限に抑えたい場合は、DQLを使用する方がよいでしょう。

は、だからあなたの状況に私はいくつかのDQLを追加します。

$dql = 'SELECT u, t, p, r, c FROM User u JOIN u.towns_id t JOIN t.provinces_id p JOIN p.regions_id r JOIN r.countries_id c WHERE u.firstname = ?1'; 
$user = $this->em->createQuery($dql)->setParameter(1, 'test')->getResults(); 

$country = $user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname(); 

DQLは、クラスとそのプロパティ(テーブルの列にませ)上で動作します。だから、DQLを書くことによって、実際にあなたのエンティティの関連性についてdoctrineが知っているものを使用しています。

のみ1行が使用されている場合上記の結果セットは同等です:

$country = $user->getTowns_id()->getProvinces_id()->getRegions_id()->getCountries_id()->getCountryname(); 

しかし、あなたが代わりに3 SELECTSの(フードの下JOINSと)1つのSQLのSELECTクエリと同じ結果を得ます。そしてそれはより速く動くだろう。

関連する問題