我有实体Store、Owner和Town,我想计数所有者拥有的所有门店并按其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();