2012-06-20 26 views
17

Tôi đang cố gắng để xây dựng một truy vấn với các nhà xây dựng truy vấn học thuyết mà tham gia một bảng không có liên quan như thế này:Symfony 2: INNER JOIN trên bàn không có liên quan với người xây dựng truy vấn học thuyết

$query = $this->createQueryBuilder('gpr') 
     ->select('gpr, p') 
     ->innerJoin('TPost', 'p') 
     ->where('gpr.contentId = p.contentId') 

Nhưng điều này không công việc. Tôi vẫn gặp lỗi:

Error: Identification Variable TPost used in join path expression but was not defined before.

Tôi đã tìm kiếm thông báo lỗi này và mọi người trả lời sử dụng bí danh bảng + thuộc tính như p.someAttribute. Nhưng bảng tôi muốn tham gia không liên quan trong bảng tôi bắt đầu lựa chọn của mình.

Là một truy vấn mysql bình thường tôi sẽ viết nó như thế này:

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id 

Bất kỳ ý tưởng những gì tôi đang làm sai?

+0

Chúng ta có thể sử dụng DQL để thực hiện tham gia với các đối tượng không liên quan? Tôi không biết. Nếu có thể, it0s thú vị =). – sensorario

+2

Tại sao bạn không chỉ * xây dựng * một mối quan hệ giữa hai, nếu bạn muốn tham gia cùng họ? –

+0

Trong trường hợp này, một mối quan hệ sẽ không đủ. Tôi sẽ cần quan hệ với 3 bảng khác nhau và bất kỳ bản ghi nào chỉ có thể đặt tham chiếu đến 1 trong số này 3. –

Trả lời

51

Hôm nay, tôi đã làm việc về nhiệm vụ tương tự và nhớ rằng tôi đã mở vấn đề này. Tôi không biết từ đó phiên bản học thuyết nào hoạt động nhưng ngay bây giờ bạn có thể dễ dàng tham gia các lớp con trong ánh xạ thừa kế. Vì vậy, một truy vấn như thế này đang hoạt động mà không có bất kỳ sự cố nào:

$query = $this->createQueryBuilder('c') 
     ->select('c') 
     ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id') 
     ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id') 
     ->orderBy('c.createdAt', 'DESC') 
     ->where('co.group = :group OR ct.group = :group') 
     ->setParameter('group', $group) 
     ->setMaxResults(20); 

Tôi bắt đầu truy vấn trong lớp cha mẹ đang sử dụng ánh xạ thừa kế. Trong bài trước của tôi, nó là một điểm khởi đầu khác nhau nhưng cùng một vấn đề nếu tôi nhớ đúng.

Vì đó là một vấn đề lớn khi tôi bắt đầu vấn đề này, tôi nghĩ rằng nó cũng có thể là thú vị cho những người khác mà không biết về nó.

+0

Cảm ơn bạn! Điều này thực sự hữu ích, tôi đã tìm kiếm hàng giờ. – Assil

+0

nếu tôi không có 'MyBundleName: ChildTwo' kho lưu trữ, tôi muốn viết truy vấn với tên bảng thì giải pháp là gì. –

+0

@MohammadFareed Tham chiếu đến thực thể không phải là một kho lưu trữ, nó là một chuỗi trong dạng ': ' HOẶC FQCN của lớp thực thể, ví dụ: \ AppBundle \ Entity \ ChildTwo :: class –

0

Kết nối DQL chỉ hoạt động nếu liên kết được xác định trong ánh xạ của bạn. Trong trường hợp của bạn, tôi muốn nói rằng dễ dàng hơn nhiều khi thực hiện truy vấn gốc và sử dụng ResultSetMapping để điền các đối tượng của bạn.

2
$dql = "SELECT 
    a, md.fisrtName , md.LastName, mj 
    FROM MembersBundle:Memberdata md 
     INNER JOIN MembersBundle:Address a WITH md = a.empID 
     INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData 
      ... 
    WHERE 
     a.dateOfChange IS NULL 
    AND WHERE 
     md.someField = 'SomeValue'"; 

return $em->createQuery($dql)->getResult(); 
+1

Trong khi câu trả lời này không cung cấp các chi tiết cần thiết, không có gì để trích dẫn như tài liệu của Doctrine hoàn toàn thiếu sự bao phủ của các kiểu kết nối này. Điều này làm việc cho tôi. Tôi biết đủ sql để phân tích những gì đã được dự định và không đủ học thuyết để kết nối các dấu chấm. – eggmatters

3

tham gia giữa các thực thể mà không cần các hiệp hội là không thể cho đến khi phiên bản 2.4, nơi bạn có thể tạo ra một tùy ý tham gia với cú pháp sau:

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email'); 

tham khảo: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

+0

Điều này thật tuyệt vời!Lưu ý rằng mệnh đề 'WITH' là bắt buộc trong trường hợp này, nếu không nó sẽ dẫn đến lỗi cú pháp. Tuy nhiên bạn chỉ có thể sử dụng một điều kiện giả và về cơ bản có được một tham gia chéo thực sự, mà DQL không hỗ trợ khác. Ví dụ: 'SELECT u FROM User u JOIN Items i WITH 0 = 0'. Điều này có thể hữu ích cho các thống kê phức tạp. – jlh

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