2012-02-01 5 views
52
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 

Tôi có thể thực hiện điều này trong Doctrine bằng cách nào?Cách sử dụng vàWhere và orWhere trong Doctrine?

$q->where("a = 1"); 
$q->andWhere("b = 1") 
$q->orWhere("b = 2") 
$q->andWhere("c = 1") 
$q->orWhere("d = 2") 

isnt này một cách chính xác ... nên là:

$q->where("a = 1"); 
$q->andWhere("b = 1") 
    $q->orWhere("b = 2") 
$q->andWhere("c = 1") 
    $q->orWhere("d = 2") 

nhưng làm thế nào tôi có thể làm điều đó? Trong Propel có chức năng getNewCriterion và trong Doctrine ...?

Trả lời

82
$q->where("a = 1") 
    ->andWhere("b = 1 OR b = 2") 
    ->andWhere("c = 2 OR c = 2") 
    ; 
+6

Sau đó, tại sao không chỉ đặt tất cả trong cuộc gọi 'where()'? – MatBailie

+3

Tôi sẽ không hài lòng với loại cú pháp này ... Điều gì sẽ xảy ra nếu bạn cố gắng chuyển sang một số loại "SQL" bị bệnh, trong đó 'OR' sẽ được thay thế bằng' || '... bạn cần sử dụng 'b =? HOẶC b =? ' – Vyktor

+0

@ Dường Vâng, chắc chắn là có thể. Phương thức này nhanh hơn, tho. – Maerlyn

11

Tại sao không chỉ

$q->where("a = 1"); 
$q->andWhere("b = 1 OR b = 2"); 
$q->andWhere("c = 1 OR d = 2"); 

EDIT: Bạn cũng có thể sử dụng Expr class (Doctrine2).

+0

Câu hỏi dành cho học thuyết 1.2, tài liệu bạn đã liên kết là dành cho 2.0. – Maerlyn

+4

@Maerlyn, vâng, câu hỏi không có thẻ 'doctrine-1.2', vì vậy tôi không thể chắc chắn người dùng có nghĩa là gì - trong trường hợp đó tôi ngầm mong đợi cái mới nhất. – Czechnology

+0

Sai lầm của tôi, không biết có và ở đâu và hoặc ở đâu trong trình xây dựng truy vấn của doctrine2. – Maerlyn

39

Dưới đây là một ví dụ cho những người có điều kiện phức tạp hơn và sử dụng Doctrine, 2. * với QueryBuilder:

$qb->where('o.foo = 1') 
    ->andWhere($qb->expr()->orX(
     $qb->expr()->eq('o.bar', 1), 
     $qb->expr()->eq('o.bar', 2) 
    )) 
    ; 

Đó là những biểu hiện nêu tại Czechnology câu trả lời.

+1

đã giúp tôi. chúc mừng :) – Sharpy35

+0

cuộc sống tiết kiệm :) cảm ơn – Hooli

0

Một điều còn thiếu ở đây: nếu bạn có một số thay đổi của các yếu tố mà bạn muốn đặt lại với nhau để một cái gì đó giống như

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%') 

và không muốn để lắp ráp một DQL-String chính mình, bạn có thể sử dụng orX đề cập ở trên như sau:

$patterns = ['abc', 'def']; 
$orStatements = $qb->expr()->orX(); 
foreach ($patterns as $pattern) { 
    $orStatements->add(
     $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%')) 
    ); 
} 
$qb->andWhere($orStatements);