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