2012-03-29 30 views
6

Tôi đang cố gắng tìm ra cách thực hiện truy vấn nhiều người trong Doctrine 2 và dường như tôi không thể tìm ra câu trả lời. Tôi biết chính xác làm thế nào tôi sẽ làm điều đó trong SQL thẳng:Truy vấn nhiều người trong Doctrine 2

 SELECT ma.id, 
      ma.name 
     FROM user u 
     JOIN user_media_area uma ON uma.user_id = u.id 
     JOIN media_area ma ON uma.media_area_id = ma.id 

Tôi sẽ làm điều tương tự với Doctrine như thế nào?

+2

Tại sao câu hỏi này lại bị bỏ phiếu? –

Trả lời

5

Tài liệu hướng dẫn có một số ví dụ điển hình: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

Trong trường hợp của bạn nó sẽ giống như thế:

// Build query 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 

    $qb->addSelect('user'); 
    $qb->addSelect('mediaArea'); 

    $qb->from('SomeBundle:User','user'); 

    $qb->leftJoin('user.userMediaArea','userMediaArea'); 
    $qb->leftJoin('userMediaArea.mediaArea','mediaArea'); 

    $query = $qb->getQuery(); 
    $users = $query->getResult(); 
    echo $users[0]->getUserMediaArea()->getName(); 

Bạn không gửi mã thực thể của bạn vì vậy tôi đã phải làm một số đoán vào cách bạn định nghĩa các mối quan hệ. Nếu bạn chỉ có một ManyToMany đơn giản giữa Người dùng và MediaArea thì bạn có thể bỏ qua việc tham gia UserMediaArea. D2 sẽ tìm ra. Và kể từ khi bạn thực sự chỉ muốn thông tin MediaArea tôi thực sự sẽ đảo ngược các truy vấn và làm một lựa chọn từ MediaArea để thông tin người dùng sẽ không cần phải được trả lại. Nhưng tôi đã cố gắng làm theo truy vấn ban đầu của bạn.

+0

Cảm ơn! Điều đó hiệu quả. (Tôi đã chỉnh sửa mã gốc của bạn một chút, nhưng tại thời điểm nhận xét này, bản chỉnh sửa chưa được đánh giá ngang hàng). Cảm ơn bạn đã thực sự hiểu câu hỏi của tôi và bằng cách sử dụng tên thực thể của tôi trong câu trả lời của bạn. –

+0

@Cerad có bạn có ý tưởng làm thế nào để làm điều này trong sql bản địa với bản đồ thiết lập kết quả. – hardik

+0

Đáng buồn là không. Trong một vài trường hợp tôi đã phải sử dụng sql (vì lý do hiệu suất), tôi tự vẽ bản đồ. – Cerad

-1
SELECT ma.id, ma.name 
FROM User u 
JOIN u.media 

Người dùng là thực thể Người dùng và u.media là thực thể Phương tiện.

+1

Cảm ơn bạn đã trả lời. Điều gì về phần PHP của nó? Làm thế nào mà đi? –

+0

$ sql = 'SELECT ma.id, ma.name FROM Người dùng u THAM GIA u.media'; \t $ result = $ entityManager-> createQuery ($ sql) -> getResult(); –

+0

Tôi không thử điều này. Sau khi kiểm tra chặt chẽ hơn, DQL của bạn thậm chí không tham khảo bảng tham gia của tôi. Bạn sẽ đến từ đâu? Ngoài ra, tôi không có bất cứ thứ gì gọi là 'media'. Tôi không chắc chắn rằng bạn đọc câu hỏi của tôi hoặc đọc lại câu trả lời của bạn quá cẩn thận. –

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