我有 3 个表 - 用户、区域和联系人。联系人可以属于用户或区域。一个用户可以属于很多领域。
我想提取属于用户的所有联系人(如数据库中特别定义的),以及与用户属于同一区域的所有联系人。
我能否重新审视我的数据库映射,以及我需要用 DQL 编写的查询以获得我想要的东西。我在我的数据库映射中做错了吗?
我绝对是一个 SQL 人,并且能够轻松地用纯 SQL 获取我想要的东西。在普通的 SQL 中,这就是我想要做的:
select c.* from contact c LEFT JOIN user_area ua ON c.area_id=ua.area_id where (ua.user_id=XXX OR c.user_id=XXX);
用户
/**
* @ORM\ManyToMany(targetEntity="area", inversedBy="areas")
* @ORM\JoinTable(name="user_area",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="area_id", referencedColumnName="id")}
* )
*/
private $areas;
/**
* @ORM\OneToMany(targetEntity="Contact", mappedBy="user")
*/
private $contacts;
接触
/**
* @ORM\ManyToOne(targetEntity="Area")
* @ORM\JoinColumn(name="area_id", referencedColumnName="id")
*/
private $area;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="Contacts")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
区域
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="users")
*/
private $users;
/**
* @ORM\OneToMany(targetEntity="Contact", mappedBy="area")
*/
private $contacts;
我遇到的主要问题是 DQL 确实希望您查询一个对象,而在 SQL 中查询用户/区域关系表以获得我想要的内容更容易。我试图编写一个查询,从联系人中提取区域,然后从联系人中提取用户,然后从区域中提取用户,但我收到一条错误消息,指出“用户”不是我的区域对象中定义的索引。再说一次,我是 Doctrine 新手,所以我可能做错了什么。
这是我在 Symfony 中的 User 对象中尝试的查询:
$qb = $em->createQueryBuilder()
->addSelect('c')
->from('MyBundle:Contact', 'c')
->leftJoin('c.area', 'ca')
->leftJoin('c.user', 'cu')
->leftJoin('ca.users', 'cau')
->add('where', 'c.user = ?1 OR cau.id = ?1')
->add('orderBy', 'c.name')
->setParameter(1, $this->getId());