如何使用Doctrine QueryBuilder选择所有列?

时间:2016-05-17 17:32:51

标签: php mysql symfony doctrine-orm doctrine

我有实体商店所有者城镇,我想统计所有商店所有者按照他们的城镇分类。

我在控制器中有这个查询

$query = $this->getDoctrine()->getRepository('WebBundle:Store')
   ->createQueryBuilder('s')
     ->select('t.name, COUNT(s) as counter')
     ->groupBy('s.town')
     ->leftJoin('s.owner','o')
     ->leftJoin('s.town','t')
     ->where('s.owner = :id')
     ->orderBy('t.name','ASC')
     ->setParameter('id', $id)
  ->getQuery();

$list = $query->getResult();

有没有办法选择Town中的所有列而不是声明每一列?像->select('t.*, COUNT(s) as counter')这样的东西。我可以选择我现在需要的那些,但对于较大的表我将需要其他方法。

我已经尝试了->select('t, COUNT(s) as counter'),但我收到了异常错误。

有关详细信息,请在我的twig模板中显示:

{% for town in list %}
    <span>{{ town.name }}</b> [{{ town.counter }}]</span>
{% endfor %}

感谢大家的建议!

2 个答案:

答案 0 :(得分:2)

我猜你的实体中有一些关系。

Owner必须与Store建立1-n关系。

因此,您的Owner实体将如下所示:

class Owner
{
    protected $stores;

    // ...

    public function __construct()
    {
        $this->stores = new ArrayCollection();
    }

    public function getStores()
    {
        return $this->stores;
    }

    public function setStores($stores)
    {
        $this->stores = new ArrayCollection();

        foreach ($stores as $store)
        {
            $this->stores->add($store);
        }

        return $this;
    }

    public function addStore(Store $store) // ... can use $this->store->add()

    public function removeStore(Store $store) // ... can use $this->store->removeElement()

    // etc ...

}

现在,您可以使用Collection::count() Doctrine方法!

$storesCnt = $user->getStores()->count();

您想获得用户和城镇的所有商店吗? 没问题 ! Collection::filter()是你的朋友!

$storesForAUserAndAGivenTown = $user->getStores()->filter(function (Store $store) use ($town) {
    return ($store->getTown() === $town);
});

就是这样。

考虑Doctrine的第一条规则是Forget the database !,所以只有在必要时才使用DQL或QueryBuilder。

希望它会对你有所帮助。

答案 1 :(得分:0)

您可以通过省略列名称或匹配所有通配符来选择全部。所以,代替t.name或t。*,你可以简单地这样做:

        $query = $this->getDoctrine()->getRepository('WebBundle:Store')
              ->createQueryBuilder('s')
              ->select('t, COUNT(s) AS counter')
              ->groupBy('s.town')
              ->leftJoin('s.owner','o')
              ->leftJoin('s.town','t')
              ->where('s.owner = :id')
              ->orderBy('t.name','ASC')
              ->setParameter('id', $id)
              ->getQuery();

            $list = $query->getResult();