2012-06-18 21 views
11

Xin chào tôi có ba thực thể Doctrine2 trong ứng dụng Symfony2 của tôi: hai ("Promo" và "PromoPeriod") trong gói Acme: PromoBundle; một ("Shop") trong gói Acme: ShopBundle. Các mối quan hệ là: Quảng cáo - PromoPeriod: Nhiều người một-một-. PromoPeriod - Shop: One-to-Many.Truy vấn Doctrine2 với lựa chọn trên nhiều thực thể từ các gói Symfony2 khác nhau

Trong kho của đối tượng "Promo", tôi cố gắng để có được tất cả các quảng cáo và các cửa hàng như sau:

return $this->getEntityManager() 
     ->createQuery("SELECT p, s 
      FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s") 
      ->getResult(); 

nơi: p.period là mối quan hệ giữa p dụ Promo và giai đoạn PromoPeriod ; pp.shops là mối quan hệ giữa PromoPeriod Trang và các cửa hàng. Các lỗi sau đây được trả về:

An exception has been thrown during the rendering of a template 
("The parent object of entity result with alias 's' was not found. 
The parent alias is 'pp'.") 

Vì vậy, tôi cho rằng học thuyết là không có khả năng hiểu các loại "s" (mà là một thực thể Shop), vì nó nằm trong gói khác. Do đó, tôi đã cố gắng thêm mệnh đề INSTANCE OF:

SELECT p, s 
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s 
WHERE s INSTANCE OF AcmeShopBundle:Shop 

Và một lần nữa không có gì. Có lẽ đây không phải là cách để giải quyết vấn đề.

Bất kỳ ý tưởng nào?

+0

Nếu bạn sử dụng FQCN thì sao? –

+0

Tôi nên sử dụng FQCN như thế nào? Hãy nhớ rằng trong truy vấn SQL Doctrine2 được xây dựng theo một cách khác, vì Doctrine2 là một ORM. – JeanValjean

+0

Mmm, mmm, FQCN = Tên lớp hoàn toàn đủ điều kiện, cách bạn chọn Thực thể đang sử dụng một bí danh Doctrine2 (AcmePromoBundle). Bí danh được sử dụng để tắt tên thực thể trong khi viết truy vấn, nó được ánh xạ trực tiếp đến không gian tên thực. Tôi yêu cầu bạn thử sử dụng FQCN để kiểm tra xem đó có phải là vấn đề bí danh hay không. Việc chọn FQCN sẽ hoạt động trong bất kỳ phần nào của ứng dụng của bạn. –

Trả lời

23

Bạn nên chọn 3 đơn vị, như vậy

SELECT p, pp, s 
FROM AcmePromoBundle:Promo p 
JOIN p.period pp 
JOIN pp.shops s 

Bạn đang làm một lấy tham gia, ví dụ: học thuyết sẽ trở lại các đối tượng của thư mục gốc của truy vấn (đây Promo (s)), và hydrat nó với các thực thể được chọn bổ sung. Vì vậy, nếu bạn nói giáo lý để tải các cửa hàng, rằng "đến" từ thời kỳ, nhưng để không chọn thời gian ... ông không thể làm những gì bạn đang yêu cầu nó làm. Ở đây, truy vấn SQL trở nên tốt đẹp, đó là khi học thuyết cố gắng hydrate các đối tượng mà nó ném một ngoại lệ.

Đọc tài liệu liên quan http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

Vâng, bạn nói đúng, không có lỗi nào được trả về!Tuy nhiên, chỉ có các đối tượng 'p' được trả về, mặc dù các đối tượng' pp' và 's' được chọn! Nó có vẻ không bình thường! – JeanValjean

+1

nhưng pp và s hiện có sẵn qua p – phonixor

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