2015-11-02 58 views
2

我必須更改現有Symfony2項目中的某些內容,但不幸的是,我之前從未使用過Symfony2。Symfony2:將連接條件添加到ManyToMany關係

該數據庫包含以下表:

Location 
======== 
id 
.... 

Deal 
======== 
id 
deleted 
... 

deal_location 
================= 
deal 
location 

有新政和位置之間的許多一對多的關係。這被映射在這樣的Location.orm.yml文件:

manyToMany: 
    deals: 
     cascade: ['all'] 
     targetEntity: Deal 
     mappedBy: locations 

我想要做的就是要排除的在那裏刪除所有交易(刪除= 1)從數據庫中讀取的位置時。

我發現,這可以在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

嘗試

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

你總是要加入而你的情況似乎是交易,而不是給你的陽明交易對象的名稱。

另一件讓我想知道的問題是,爲什麼他們檢查刪除= null或false(請參閱您的代碼)的位置,但您檢查刪除= 0。您確定這是正確的檢查嗎?

+0

謝謝您的回答,缺少S爲只是一個錯字。是的,我確定檢查是正確的。出於某種原因,原始程序員在Location中使用布爾值,但在Deal中使用Int。 – Apfelsaft

+0

在將代碼複製到此問題中時出現錯字? – LBA

+0

錯字在問題中。 – Apfelsaft

-1

leftJoin()不能幫助你,只有當你在查詢中使用它的數據時才需要它,它不排除交易,因爲你在這個查詢中只有本地化。 我認爲排除本地化與刪除交易沒有幫助,因爲在某些本地化你將刪除,而不是交易。它必須位於您獲得本地化優惠的代碼的其他部分。 所以你必須首先找到交易從數據庫中獲得的地方,以使其不被刪除。

+0

一些ppl不知道教義...... –

+0

所以,我解釋一下。此方法位於LocalizationRepository中,所以別名l表示此表,執行_left_ join,您只將交易添加到本地化中,做一些雙重處理,一些根本沒有處理,但不限制本地化。接下來的事情是學說是如何工作的,即使你做了連接,但是不在select()中聲明你想要保存表,學說不會這樣做,所以你加入數據,但是不把它放到結果對象中。因此,在迭代本地化並且執行獲得交易的方法之後,即使使用這種愚蠢的聯接,您也可以獲得所有交易。即使你保存了數據,你會得到所有的交易,但也許更少的查詢 –

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(); 
} 
+0

我認爲這隻會在位置只有一筆交易,但位置有交易列表。 – Apfelsaft

+0

糟糕,我忘了你提到它是'多對多'的關係。我已經更新了我的答案。這應該是工作 - 我有類似的關係,上面的代碼對我來說工作得很好。 – tftd

相關問題