2010-04-20 28 views
62

Trong Học thuyết bạn có thể tạo DQL trong 2 cách sau:học thuyết: QueryBuilder vs createQuery?

EntityManager :: createQuery:

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1'); 

QueryBuilder:

$qb->add('select', 'u') 
    ->add('from', 'User u') 
    ->add('where', 'u.id = ?1') 
    ->add('orderBy', 'u.name ASC'); 

Tôi tự hỏi những gì là sự khác biệt và đó nên Tôi sử dụng?

Trả lời

60
  1. DQL dễ đọc hơn vì nó rất giống với SQL. Nếu bạn không cần phải thay đổi truy vấn tùy thuộc vào tập hợp các tham số thì đây có lẽ là lựa chọn tốt nhất.

  2. Trình tạo truy vấn là một api để tạo truy vấn, vì vậy sẽ dễ dàng hơn nếu bạn cần tạo truy vấn động như lặp qua một tập hợp các tham số hoặc bộ lọc. Bạn không cần phải thực hiện bất kỳ thao tác chuỗi nào để tạo truy vấn của mình như tham gia, chia tách hoặc bất kỳ điều gì.

+0

Nhưng không có phí trên phân tích cú pháp chuỗi DQL trong trường hợp đầu tiên? Hoặc các nhà xây dựng làm cho cùng một chuỗi DQL như là một kết quả là tốt? –

+2

Có, QueryBuilder tạo chuỗi DQL cho bạn. Sau đó, DQL được phân tích cú pháp. – Dennis

31

Query builder chỉ là, cho phép nói, giao diện để tạo truy vấn ... Nó có thể thoải mái hơn để sử dụng, nó không vừa thêm() phương pháp, mà còn các phương pháp như nơi(), andWhere (), từ(), vv Nhưng cuối cùng, nó chỉ soạn truy vấn giống như truy vấn bạn sử dụng trong phương thức createQuery().

Ví dụ về sử dụng tiên tiến hơn của người xây dựng truy vấn:

$em->createQueryBuilder() 
      ->from('Project\Entities\Item', 'i') 
      ->select("i, e") 
      ->join("i.entity", 'e') 
      ->where("i.lang = :lang AND e.album = :album") 
      ->setParameter('lang', $lang) 
      ->setParameter('album', $album); 
+0

bạn có thể thêm -> setParameters (array ('x' => 'y', 'z' => 'w', ...)) –

13

Họ có mục đích khác nhau:

  • DQL là dễ dàng hơn để sử dụng khi bạn biết truy vấn đầy đủ của bạn.
  • Query builder là thông minh hơn khi bạn phải xây dựng truy vấn của bạn dựa trên một số điều kiện, vòng lặp, vv
4

Sự khác biệt chính là chi phí của cách gọi phương pháp này. Mẫu mã đầu tiên của bạn (createQuery) chỉ để đơn giản làm cho một phương thức gọi, trong khi queryBuilder làm cho 4. Khi kết thúc mọi thứ, chúng đi xuống một chuỗi đã được thực thi, ví dụ đầu tiên bạn cho nó chuỗi, và khác bạn đang xây dựng nó với nhiều cuộc gọi phương pháp xích.

Nếu bạn đang tìm kiếm lý do để sử dụng cái khác, đó là câu hỏi về kiểu dáng và trông có vẻ dễ đọc hơn. Đối với tôi, tôi thích queryBuider hầu hết thời gian, nó cung cấp các phần được xác định rõ cho truy vấn. Ngoài ra, trong quá khứ nó làm cho nó dễ dàng hơn để thêm vào logic điều kiện khi bạn cần nó.

+0

Một quan sát nhỏ - Tôi có thể nói rằng hầu như bất cứ lúc nào một dành trong bất kỳ số lượng của các cuộc gọi hàm PHP, liên quan đến SQLing, sẽ luôn ít quan trọng hơn thời gian nói chuyện, chờ đợi và kéo kết quả thực tế từ DB (chưa kể đến việc hydrating những kết quả đó, trong trường hợp ORM). – userfuser

1

Kiểm tra đơn vị có thể dễ dàng hơn khi sử dụng trình tạo truy vấn. Giả sử bạn có kho lưu trữ truy vấn một số dữ liệu dựa trên danh sách điều kiện phức tạp. Và bạn muốn đảm bảo rằng nếu một điều kiện cụ thể được chuyển vào kho lưu trữ, một số điều kiện khác sẽ được thêm vào truy vấn. Trong trường hợp DQL bạn có hai lựa chọn:

1) Để sử dụng đồ đạc và kiểm tra tương tác thực sự với DB. Mà tôi thấy hơi rắc rối và không đơn điệu.

2) Để kiểm tra mã DQL được tạo. Mà có thể làm cho thử nghiệm của bạn quá mong manh.

Với QueryBuilder, bạn có thể thay thế nó bằng mô hình và xác minh rằng "andWhere" phương pháp với thông số cần thiết được gọi. Tất nhiên những cân nhắc như vậy không áp dụng nếu truy vấn của bạn đơn giản và không phụ thuộc vào bất kỳ thông số nào.

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