我有多个表,例如它有点复杂。
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
blockE 属于 prefC
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和blockD
Bob属于blockD
然后假设,我有 BigArea 键 0(这意味着 prefB)
我想选择属于名为 prefB 的 bigarea 的块的用户。
(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;
}