首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManyToMany与Doctrine的QueryBuilder和Symfony2的关系

ManyToMany与Doctrine的QueryBuilder和Symfony2的关系
EN

Stack Overflow用户
提问于 2013-07-02 22:10:09
回答 2查看 10K关注 0票数 3

在我正在工作的网站上,我需要根据用户的设置限制很多地方的结果。这是名为Counties的用户上的一个成员,它本身就是一个实体。我把它设置成这样:

代码语言:javascript
复制
/**
 * @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
}

在我的用户实体上,我的附件如下:

代码语言:javascript
复制
// ...

/**
 * @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语句,以供参考:

代码语言:javascript
复制
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抱怨这两个实体之间没有关联:

代码语言:javascript
复制
SELECT s 
FROM AppStoreBundle:Store s 
JOIN AppUserBundle:County c WITH c.store = s.id

这是有道理的,因为县上没有“商店”成员,因为商店和用户应该有县,而不是相反,因为县只是一种标签。

我甚至试过这样做,认为它会成功,但没有多大希望:

代码语言:javascript
复制
SELECT s 
FROM AppStoreBundle:Store s 
JOIN AppUserBundle:User u WITH u.counties = s.counties

我会转而使用直接SQL而不是DQL/QueryBuilder,但是我不知道如何在表单中直接运行SQL,这是一个主要的缺点。

EN

回答 2

Stack Overflow用户

发布于 2013-07-03 03:18:07

您可以在理论文献中找到正确声明的示例。

我已经排除了下面代码示例中的其他注释

代码语言:javascript
复制
class County
{
    /**
     * @ManyToMany(targetEntity="User", mappedBy="counties")
     **/
    protected $users;
 }

 class User
 {
      /**
       * @ORM\ManyToMany(targetEntity="App\Bundle\UserBundle\Entity\County", inversedBy="users")
       * @ORM\JoinTable(name="user_county_xref",
       *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
       *      inverseJoinColumns={@ORM\JoinColumn(name="county_id", referencedColumnName="id")}
       * )
       */
      protected $counties;
 }

这将是正确的注释,实体存储库中的适当查询将是

代码语言:javascript
复制
 $queryBuilder = $this->createQueryBuilder('c');

 $queryBuilder->select(array('c', 'u'))
              ->leftJoin('c.users', 'u');

 return $queryBuilder->getQuery()->getResult();

对另一个实体来说应该是完全一样的。

票数 2
EN

Stack Overflow用户

发布于 2017-10-20 12:20:15

谢谢你托马斯·波泰尔。好样的!真的帮了我。参见下面的示例queryBuilder。string $search, int $locale在哪里。

代码语言:javascript
复制
$q  = $qb->select(array('a'))
                ->from(Article::class, 'a')
                ->leftJoin('a.locales', 'l')
                ->where(
                    $qb->expr()->like('a.articleName',"'%$search%'")
                )
                ->andWhere('l.id = '.$locale)
                ->orderBy('a.id', 'DESC')
                ->getQuery();
            $articles= $q->getResult();

            if ($articles==null)
                throw new \Exception('Article with key '.$search.' not found');

Article$locales中了解Locale。我的项目中也有ManyToMany关系:文章-> article_has_locale <- locale

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17436678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档