2013-07-11 47 views
0

我有多個表格,如 它有點複雜。從四個表格的組合中選擇用戶數據

1)正常用戶表

User 
id|username 
0 |Tom  
1 |Dad 
2 |Bob 

2),用於區域

SmallArea 
id|name |bigarea 
0 |blockA | 0(prefA) 
1 |blockB | 0(prefA) 
2 |blockC | 1(prefB) 
3 |blockD | 1(prefB) 
4 |blockE | 2(prefC) 

3的兩個表),用於區域的兩個表

BigArea 
id | name 
0 | prefA 
1 | prefB 
2 | prefC 

它意味着

BLOCKa中和blockB屬於prefA

blockC和blockD屬於的PrefB

β受體拮抗劑屬於前綴C

4)用戶和小面積的連接表

AreaConnection 
user_id|smallarea 
0(Tom) | 0(blockA) 
0(Tom) | 1(blockB) 
1(Dad) | 2(blockC) 
1(Dad) | 3(blockD) 
2(Bob) | 3(blockD) 

它意味着

湯姆屬於BLOCKa中和blockB

父親屬於blockC和塊D

鮑勃屬於blockD

然後 假設,我有BigArea鍵0(這意味着的PrefB)

我要選擇屬於屬於bigarea命名的PrefB塊的用戶。

(的PrefB有blockC和blockD,

然後爸爸鮑伯是屬於blockC或blockD,

所以爸爸鮑伯應選擇)

我怎麼會寫在SQL這個模式? Doctrine2是更好,比如

SELECT u.id,u.username 
      FROM User u 
      INNER JOIN ?????? 

這些都是我的實體。

class User.php 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer",unique=true) 
* @ORM\Id 
*/ 

private $id; 


/** 
* @var string 
* 
* @ORM\Column(type="string") 
*/ 
private $username; 

/** 
* @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\SmallArea") 
* @ORM\JoinTable(
*  joinColumns={@ORM\JoinColumn(name="areaid", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} 
*) 
*/ 

protected $SmallArea; 
} 




class BigArea 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer",unique=true) 
* @ORM\Id 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(type="string") 
*/ 
private $label; 

/** 
* 
* @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\SmallArea", mappedBy="prefecture") 
*/ 

private $prefecture; 

} 




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


    /** 
* 
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\BigArea",  inversedBy="prefecture*removethis : name of the variable in BigArea.php*") 
* @ORM\JoinColumn(referencedColumnName="id",nullable=false) 
*/ 
private $prefecture; 
} 

回答

1
Select * 
from User 
Inner Join AreaConnection on AreaConnection.userid = User.id 
Inner Join SmallArea on SmallArea on SmallArea.id = AreaConnection.smallarea 
Inner Join BigArea on BigArea.id = SmallArea.bigarea 

主義DQL。請注意,我從來沒有嘗試過,但它似乎與Hibernate相似。 如需更多信息,請參閱Doctrine ORM Documentation

Select u.username, sa.label 
from User u 
JOIN SmallArea sa 
+0

由於它工作正常SQL.But我麻煩與翻譯這doctorine2格式,,沒有人幫助嗎?在Doctorine2 AreaConnection表concealed.User和SmallArea實體做出這個自動。 – whitebear

+0

爲您必須提供您的映射 –

+0

我添加了我的實體編輯 – whitebear