我必须在现有的Symfony2项目中进行更改,但遗憾的是我以前从未使用过Symfony2。
数据库包含以下表格:
Location
========
id
....
Deal
========
id
deleted
...
deal_location
=================
deal
location
交易和位置之间存在多对多关系。它映射到Location.orm.yml文件中,如下所示:
manyToMany:
deals:
cascade: ['all']
targetEntity: Deal
mappedBy: locations
我想要做的是从数据库中读取位置时排除已删除(已删除= 1)的所有交易。
我发现,这可以在de LocationRepository类中完成。在那堂课中,我发现了以下功能:
public function getFindAllByLatLonQueryBuilder($lat, $lon)
{
$qb = $this->createQueryBuilder('l');
$qb
->where('l.deleted IS NULL OR l.deleted = false')
->orderBy('(((ACOS(SIN((:lat*PI()/180)) *
SIN((l.latitude*PI()/180))+COS((:lat*PI()/180)) *
COS((l.latitude*PI()/180)) * COS(((:lon-l.longitude)*
PI()/180))))*180/PI())*60*1.1515*1.609344)', 'ASC')
->setParameter('lat', $lat)
->setParameter('lon', $lon)
;
return $qb->getQuery()->getResult();
}
我找到了similar question并添加了以下行:
->leftJoin('l.deals', 'deals', 'WITH', 'deals.deleted = 0')
不幸的是,这不起作用。我怎样才能做到这一点?
答案 0 :(得分:2)
我的where
子句中不仅有两个条件,而是只留下where('l.deleted IS NOT true AND deals.deleted IS NOT true')
,只会添加leftJoin
子句。
这样的事情应该做的工作:
public function getFindAllByLatLonQueryBuilder($lat, $lon)
{
$qb = $this->createQueryBuilder('l')
->leftJoin('l.deal', 'deal', 'WITH', 'deal.deleted IS NOT true') // you can also try 'deal.deleted != true'
->where('l.deleted IS NOT true')
->orderBy('(((ACOS(SIN((:lat*PI()/180)) *
SIN((l.latitude*PI()/180))+COS((:lat*PI()/180)) *
COS((l.latitude*PI()/180)) * COS(((:lon-l.longitude)*
PI()/180))))*180/PI())*60*1.1515*1.609344)', 'ASC')
->setParameter('lat', $lat)
->setParameter('lon', $lon)
;
return $qb->getQuery()->getResult();
}
答案 1 :(得分:0)
试
->leftJoin('l.deals', 'deal', 'WITH', 'deal.deleted = 0')
你总是必须加入对象的名字,在你的情况下似乎是交易而不是给你的yml交易。
让我想知道的另一件事是为什么他们检查的地点是deleted = null或false(参见你的代码),但你检查了删除= 0.你确定这是正确的检查吗?
答案 2 :(得分:-1)
leftJoin()不帮助你,只有你在查询时使用它的数据才需要它,它不排除交易,因为你在这个查询中只获得本地化。 我认为排除本地化与删除的交易无济于事,因为在某些本地化中你将删除而不是交易。它必须在代码的其他部分,您可以获得本地化的交易。 所以你必须首先找到从db获得交易的地方,以使其不被删除。