2013-07-11 28 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