繁体   English   中英

Symfony2:向多对多关系添加连接条件

[英]Symfony2: Adding a join condition to a ManyToMany relationship

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

我发现了一个类似的问题并添加了以下行:

 ->leftJoin('l.deals', 'deals', 'WITH', 'deals.deleted = 0')

不幸的是,这不起作用。 我怎样才能使这项工作?

而不是在你的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();
}

尝试

->leftJoin('l.deals', 'deal', 'WITH', 'deal.deleted = 0')

您总是必须加入对象的名称,在您的情况下,该名称似乎是交易而不是给定您的 yml 的交易。

让我想知道的另一件事是为什么他们检查删除的位置 = null 或 false(请参阅您的代码)但您检查删除的 = 0。您确定这是正确的检查吗?

leftJoin() 对你没有帮助,只有当你在查询中使用它的数据时才需要它,它不排除交易,因为你在这个查询中只得到本地化。 我认为排除本地化与已删除的交易无济于事,因为在某些本地化中,您将删除而不是交易。 它必须在您获得本地化交易的代码的其他部分。 因此,您必须首先找到从 db 获取交易的位置,以使其不删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM