2011-11-30 31 views
48

Tôi có thể lọc ra các kết quả từ một mảngCollection trong Doctrine 2 trong khi sử dụng tải chậm không? Ví dụ:Doctrine 2 ArrayPhương pháp lọc theo bộ sưu tập

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

Không rõ cách thức sử dụng bộ lọc thực sự.

+0

Nhưng vẫn tải phương thức vào nhiều dữ liệu, ví dụ như đếm, tải tất cả dữ liệu phù hợp. –

Trả lời

66

Câu trả lời Boris Guery tại bài này, có thể giúp bạn: 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

Vấn đề duy nhất khi sử dụng phương pháp lọc là bạn phải tìm nạp tất cả dữ liệu trước khi có thể lọc ra, bạn có biết liệu có cách nào thực hiện điều này mà không tìm nạp mọi thứ không? – Dennis

+0

Xin chào - Tôi đang cố gắng ở trên nhưng bị lỗi cú pháp, bạn có thể cập nhật câu trả lời của mình không? – Sjwdavies

+0

@Sjwdavies Tôi đã cập nhật nó cho bạn. Thiếu() xung quanh $ idsToFilter. – Jrgns

12

trường hợp sử dụng của bạn sẽ là:

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

nếu bạn thêm -> đầu tiên() bạn sẽ nhận được chỉ mục nhập đầu tiên được trả về, đó không phải là những gì bạn muốn.

@ Sjwdavies Bạn cần đặt() xung quanh biến mà bạn chuyển đến USE. Bạn cũng có thể rút ngắn dưới dạng trả lại của in_array là boolean:

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

Phương thức Collection#filter thực sự mong muốn tải tất cả các thành viên. Lọc ở cấp SQL sẽ được thêm vào trong học thuyết 2.3.

+1

hiện tại có đúng là 2.3 không? Tôi đã không tìm thấy nó trong tài liệu. Bây giờ chúng ta có thể thực hiện các công cụ như bộ lọc và những thứ khác, mong rằng bộ sưu tập sẽ áp dụng bộ lọc cho truy vấn và trì hoãn truy vấn? – Pinetree

+0

@Pinetree Ít nhất là họ nói như vậy: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections – Robin

101

Học thuyết hiện có Criteria cung cấp một API duy nhất để lọc các bộ sưu tập với SQL và trong PHP, tùy thuộc vào ngữ cảnh.

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

Cập nhật

này sẽ đạt được kết quả trong câu trả lời được chấp nhận, mà không nhận được tất cả mọi thứ từ cơ sở dữ liệu.

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

Cảm ơn bạn đã xóa thông tin này sẽ thực sự thay đổi truy vấn sql , thay vì chọn mọi thứ từ cơ sở dữ liệu và sau đó áp dụng bộ lọc thông qua chu trình! – tftd

+0

http: // stackoverflow.com/questions/35358597/in-predicate-with-criteria-filtering-isnt-working xin vui lòng, hãy xem ở đây :) – DonCallisto

+0

Có vẻ như có một vấn đề khi sử dụng 'indexBy =" xxx "' trên một bộ sưu tập và gọi 'phù hợp 'trên đó, nơi các chỉ mục bị loại bỏ. https://github.com/doctrine/doctrine2/issues/4693 – fyrye

Các vấn đề liên quan