簡體   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