2011-11-30 60 views
48

我可以在使用惰性加載的時候過濾掉Doctrine 2中arrayCollection的結果嗎?例如,Doctrine 2 ArrayCollection過濾方法

// users = ArrayCollection with User entities containing an "active" property 
$customer->users->filter('active' => TRUE)->first() 

目前還不清楚過濾方法是如何實際使用的。

+0

但仍然方法加載到許多數據,例如計數,加載所有匹配的數據。 – 2013-09-19 23:05:08

回答

66

的鮑里斯·伽利湖答案的這個職位,可以幫助你: Doctrine 2, query inside entities

$idsToFilter = array(1,2,3,4); 

$member->getComments()->filter(
    function($entry) use ($idsToFilter) { 
     return in_array($entry->getId(), $idsToFilter); 
    } 
); 
+4

使用過濾器方法的唯一問題是,您必須先取出所有數據,然後才能將其過濾出來,您知道是否有一種方法可以在不取出所有內容的情況下執行此操作? – Dennis

+0

嗨 - 我正在嘗試以上,但得到語法錯誤,你能更新你的答案? – Sjwdavies

+0

@Sjwdavies我爲你更新了它。 Missing()圍繞$ idsToFilter。 – Jrgns

12

您的使用情況是:

$ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) { 
         return $user->getActive() === TRUE; 
        }); 

如果添加 - >第(),你會得到只有返回的第一個條目,這不是你想要的。

@ Sjwdavies 您需要將()傳遞給USE的變量。您也可以縮短爲in_array回報是一個布爾值已經:

$member->getComments()->filter(function($entry) use ($idsToFilter) { 
     return in_array($entry->getId(), $idsToFilter); 
    }); 
-1

Collection#filter方法確實渴望加載所有成員。 在SQL級別過濾將被添加在教條2.3中。

+1

現在2.3是真的嗎?我沒有在文檔中找到它。 我們現在可以做類似過濾器和其他事情的東西,期望集合將過濾應用到查詢並推遲查詢嗎? – Pinetree

+0

@Pinetree至少他們這樣說:http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections – Robin

101

原則現在有Criteria,它提供了一個API,用於根據上下文使用SQL和PHP過濾集合。

http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections

更新

這將實現結果的接受的答案,而不從數據庫中獲取的一切。

use Doctrine\Common\Collections\Criteria; 

/** 
* @ORM\Entity 
*/ 
class Member { 
    // ... 
    public function getCommentsFiltered($ids) { 
    $criteria = Criteria::create()->where(Criteria::expr()->in("id", $ids)); 

    return $this->getComments()->matching($criteria); 
    } 
} 
+0

感謝您清除這將實際上改變sql查詢,而不是選擇數據庫中的所有內容,然後通過循環應用過濾器! – tftd

+0

http:// stackoverflow。com/questions/35358597/in-predicate-with-criteria-filtering-isnt-working please,看看這裏:) – DonCallisto

+0

在集合上使用'indexBy =「xxx」'並調用'匹配時出現一個問題'在上面,索引被丟棄。 https://github.com/doctrine/doctrine2/issues/4693 – fyrye