如何使用Doctrine QueryBuilder选择所有列



我有实体StoreOwnerTown,我想计数所有者拥有的所有门店并按其Town分类。

我的控制器中有此查询

$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();

有没有办法从城镇中选择所有列,而不是声明每一列?类似->select('t.*, COUNT(s) as counter')。我现在可以选择我需要的,但对于较大的表,我需要其他方法。

我尝试过->select('t, COUNT(s) as counter'),但出现异常错误。

为了获得更多信息,在我的小树枝模板中,我想显示以下内容:

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

谢谢你的建议!

我想您的实体中有一些关系。

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()学说的方法了!

$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。

希望它能帮助你。

您可以通过省略列名(如通配符或匹配所有通配符)来全选。因此,您可以简单地执行t Like So:,而不是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();

相关内容

  • 没有找到相关文章

最新更新