[英]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.