2012-02-27 9 views
9

Khung công tác symfony có tệp ứng dụng/bảng điều khiển có thể được thực thi qua php để thực hiện một số tác vụ bảo trì. Nó cho phép người dùng chạy truy vấn DQL:Học thuyết sẽ không cho phép tôi chọn các trường cụ thể

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id, u.nameFirst, u.nameLast FROM DatabaseBundle:User u' 
array 
    0 => 
    array 
     'id' => string '1' (length=1) 
     'nameFirst' => string 'jaroslav' (length=8) 
     'nameLast' => string 'rakhmatoullin' (length=13) 
    1 => 
    array 
     'id' => string '2' (length=1) 
     'nameFirst' => string 'Båb Kåre' (length=10) 
     'nameLast' => string 'Ytrefoss' (length=8) 

Quan sát rằng tôi đã chọn ba cột cụ thể. Vấn đề tôi gặp phải là một truy vấn tương tự cho tôi một lỗi khi hai bảng được nối.

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r' 

    [Doctrine\ORM\Query\QueryException]     
    [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
    Error: Cannot select entity through identification variables 
    without choosing at least one root entity alias. 

Lợi nhuận sau toàn bộ người sử dụng tham gia với vai trò của mình:

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r' 

Rõ ràng, tôi là thiếu một cái gì đó.

Bất kỳ ý tưởng nào? Tôi cũng sẽ đánh giá cao các liên kết đến các tài liệu thích hợp (về vấn đề cụ thể này).

+1

Tôi không hiểu được thông báo lỗi rất tốt, nhưng tôi nhớ lại trải qua các thông báo lỗi tương tự, và giải quyết vấn đề của tôi bằng cách chọn r.id, vì vậy tôi nghĩ rằng bạn nên cố gắng chọn nhiều lĩnh vực. – greg0ire

+1

thì sao? ''SELECT u.id, r. * FROM DatabaseBundle: Người dùng u JOIN u.roles r'' – jere

+1

greg0ire đúng. tôi nghĩ bạn không thể chọn một trường duy nhất VÀ một đối tượng "thực thể" trong một truy vấn như vậy. – jere

Trả lời

28

Từ documentation on "Partial Object Syntax":

Theo mặc định khi bạn chạy một truy vấn DQL trong Giáo Lý và chỉ chọn một tập hợp con của các trường cho một thực thể nào đó, bạn không nhận được đối tượng trở lại. Thay vào đó, bạn chỉ nhận được mảng dưới dạng một tập kết quả hình chữ nhật bằng phẳng, tương tự như cách bạn làm nếu bạn chỉ sử dụng SQL trực tiếp và tham gia một số dữ liệu.

Nếu bạn muốn chọn một phần đối tượng, bạn có thể sử dụng từ khóa một phần DQL.

php console doctrine:query:dql --hydrate array \ 
    'SELECT partial s.{name ,id}, partial c.{name, id } 
    FROM DatabaseBundle:ProductCategories c 
    JOIN c.suppliers s ORDER BY s.name, c.name' 
+1

Lưu ý, bạn phải bao gồm khóa chính trong một truy vấn một phần - nếu không bạn sẽ gặp phải một lỗi khó chịu. –

+2

Hai năm sau, tôi không hiểu câu trả lời của riêng mình, nhưng nếu tôi nhớ chính xác, điều quan trọng là: mỗi danh mục sản phẩm được ánh xạ là "c" và mọi category.supplier [] được ánh xạ dưới dạng s. Mọi danh mục đều có các nhà cung cấp được ánh xạ thông qua "@ chú thích tham gia" trong lớp ProductCategories. Cảm ơn tất cả các phiếu bầu. Tôi nghĩ 10 là đủ. –

+1

Nhưng nếu bạn thực sự muốn có đối tượng đầy đủ thì sao? Tôi có nghĩa là ví dụ một số lĩnh vực của các đối tượng A và sau đó toàn bộ đối tượng B? –