2015-08-26 17 views
6

Tôi có mối quan hệ nhiều-nhiều, và khi tôi tải một thực thể ở một bên mối quan hệ này, tôi mong đợi xem thuộc tính của nó ArrayCollection của các thực thể liên quan ở phía bên kia. Tuy nhiên, điều này không xảy ra - ArrayCollection được tải không có phần tử nào trong đó, trong khi trong cơ sở dữ liệu tôi có thể thấy các mục liên quan. Điều gì có thể là lý do?Symfony2: Doctrine không tải các thực thể liên quan trong quan hệ nhiều-nhiều

Đây là mã của tôi:
Một bên của mối quan hệ, ConsolidatedReport lớp:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

Một bên của mối quan hệ, đáp ứng lớp:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\ConsolidatedReport\ConsolidatedReport", mappedBy="responses") 
*/ 
private $consolidatedReports; 

Dưới đây là chức năng tôi chạy đến có được một thể hiện của ConsolidatedReport. Chức năng này nằm bên trong một dịch vụ đang được gọi là từ container:

/** 
* Picks the consolidated report with given id. 
* 
* @param string $id 
* 
* @return ConsolidatedReport 
* 
* @throws NonExistentConsolidatedReportException if the survey doesn't exist 
*/ 
public function pick($id) 
{ 
    $report = $this->repository->findOneBy(array('id' => $id)); 

    if (!$report) { 
     throw new NonExistentConsolidatedReportException($id); 
    } 

    return $report; 
}' 

Trong cơ sở dữ liệu, có "con_rprt_responses" bảng với hai cột "consolidated_reports_id" và "RESPONSE_ID". Tuy nhiên, trong profiler tôi không thấy bất kỳ truy vấn nào cho bảng đó.

Điều gì có thể xảy ra ở đây?

CẬP NHẬT: Vui lòng xem câu trả lời của tôi cho câu hỏi này bên dưới, có hiệu quả đối với tôi.

+0

Trong hồ sơ, tôi không thấy bất kỳ truy vấn nào được thực hiện cho bảng "con_rpt_responses". – Vasily802

Trả lời

5

Tôi đã thêm fetch="EAGER" vào thuộc tính $ response của lớp ConsolidatedReport và hoạt động.

Mã bây giờ trông như thế này:

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports", fetch="EAGER") 
* @ORM\JoinTable(name="con_rprt_responses") 
*/ 
private $responses; 

Thông tin thêm ở đây: http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

Tuy nhiên nếu ai đó biết lý do tại sao bộ sưu tập của tổ chức có liên quan sẽ không tải mà không chỉ định rõ quyến rũ háo hức - hãy chia sẻ kiến thức của bạn, nó được đánh giá cao!

+0

Tôi đang gặp vấn đề tương tự với quan hệ một-nhiều, và 'fetch =" EAGER "' cũng đã giải quyết nó. Nó rất kỳ quặc. Bạn đã bao giờ tìm ra lý do tại sao mong muốn tìm nạp được yêu cầu? –

0

Nếu bạn chỉ định joinColumns, điều này có giải quyết được sự cố của bạn không?

/** 
* @ORM\ManyToMany(targetEntity="P24\Response", inversedBy="consolidatedReports") 
* @ORM\JoinTable(name="con_rprt_responses", 
* joinColumns={@ORM\JoinColumn(name="consolidated_reports_id", referencedColumnName="id")}, 
* inverseJoinColumns={@ORM\JoinColumn(name="response_id", referencedColumnName="id")} 
*) 
*/ 
+0

không, nó không – Vasily802

0

Thuộc tính * toMany phải được khởi tạo bằng ArrayCollection.

public function __construct() { 
    $this->responses = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this-> consolidatedReports = new \Doctrine\Common\Collections\ArrayCollection(); 
} 
+0

có, điều này được chỉ định – Vasily802

0

Trong trường hợp bạn có hơn sau đó truy vấn duy nhất để lấy các đối tượng tương tự sử dụng Doctrine, cố gắng sử dụng:

$entityManager->clear(); 

ở giữa, để sửa chữa "mất tích" thực thể. Nó không phải là giải pháp "như là", tuy nhiên có thể cung cấp cho bạn một ý tưởng gì đó sai trong chuỗi truy vấn của bạn.

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