Symfony2:为ManyToMany关系添加连接条件

时间:2015-11-02 14:38:44

标签: php symfony doctrine-orm

我必须在现有的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')

不幸的是,这不起作用。我怎样才能做到这一点?

3 个答案:

答案 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获得交易的地方,以使其不被删除。