在我正在处理的网站上,我需要根据用户的设置在很多地方限制结果。这是名为 Counties 的用户上的成员,它本身就是一个实体。我的设置是这样的:
/**
* @ORM\Entity
* @ORM\Table(name="county")
*/
class County
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(type="string")
*/
protected $name;
// ... Getters and Setters
}
在我的用户实体上,我将其附加如下:
// ...
/**
* @ORM\ManyToMany(targetEntity="App\Bundle\UserBundle\Entity\County")
* @ORM\JoinTable(name="user_county_xref",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="county_id", referencedColumnName="id")}
* )
*/
protected $counties;
// ...
/**
* Add counties
*
* @param \App\Bundle\UserBundle\Entity\County $counties
* @return User
*/
public function addCountie(\App\Bundle\UserBundle\Entity\County $counties)
{
$this->counties[] = $counties;
return $this;
}
/**
* Remove counties
*
* @param \App\Bundle\UserBundle\Entity\County $counties
*/
public function removeCountie(\App\Bundle\UserBundle\Entity\County $counties)
{
$this->counties->removeElement($counties);
}
/**
* Get counties
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getCounties()
{
return $this->counties;
}
这一切都像它应该的那样工作,我可以毫无问题地将县附加到用户。
然后我有一个名为 Store 的第二个实体,它也附加了这些县实体。我做了相同的声明,但将JoinTable
名称更改为不同的名称,并将其更改JoinColumn
为使用store_id
而不是user_id
. 就其本身而言,这工作得很好。我可以将县与商店联系起来。
现在,我想做的是根据用户的县限制县。例如,如果用户在 A 县和 B 县,我只想查看 A 县和 B 县的商店。
我无法弄清楚如何使用 DQL 或查询生成器来做到这一点。当我尝试在表单中使用它时,这让事情变得更糟,而且由于我无法正确获取 QueryBuilder 语法,我无法找到一种方法来让数据自我限制。
当您以这种方式设置实体时,如何执行 QueryBuilder 或 DQL 语句?
编辑
这是我试图复制的 SQL 语句,以供参考:
SELECT S.*
FROM store S
JOIN store_county_xref SCX
ON SCX.store_id=S.id
JOIN user_county_xref UCX
ON UCX.county_id=RCX.county_id
WHERE UCX.user_id = 1
部分问题是我不确定应该使用什么。如果我添加 mappedBy 或 inversedBy,Doctrine 会抱怨索引不存在(因为它似乎在查看实体表,而不是声明的 JoinTable)。我无法加入这样的表格,因为 Doctrine 抱怨这两个实体之间没有关联:
SELECT s
FROM AppStoreBundle:Store s
JOIN AppUserBundle:County c WITH c.store = s.id
这是有道理的,因为县里没有“商店”成员,因为商店和用户之类的东西应该有县,而不是相反,因为县只是一种标签。
我什至试过这个,认为它会起作用,但没有太大希望:
SELECT s
FROM AppStoreBundle:Store s
JOIN AppUserBundle:User u WITH u.counties = s.counties
我会改用直接 SQL 而不是 DQL/QueryBuilder,但我不确定如何在表单中运行直接 SQL,这是一个主要缺点。