2016-05-19 13 views
6

Sử dụng Symfony và Doctrine với trình tạo truy vấn DQL, tôi cần tùy ý thêm một số điều kiện WHERE với các tham số, với một số nếu điều kiện kiểm tra.Trình tạo truy vấn Df của Symfony và Doctrine: cách sử dụng nhiều setParameters bên trong nếu điều kiện kiểm tra?

Pseudo mã ví dụ:

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb = $qb 
    ->select('SOMETHING') 
    ->from('SOMEWHERE') 
    ->where('SOME CONDITIONS'); 


if (SOME CHECK) { 
    $qb 
     ->andWhere('field1 = :field1') 
     ->andWhere('field2 = :field2') 
     ->setParameters([ 
      'field1' => $myFieldValue1, 
      'field2' => $myFieldValue2, 
     ]); 
} else { 
    $qb 
     ->andWhere('field1 = :field1') 
     ->setParameters([ 
      'field1' => $myOtherFieldValue1, 
     ]); 
} 

Bắt lỗi như:

số tham số không hợp lệ: số biến ràng buộc không khớp với số của thẻ

Quá ít thông số: các định nghĩa truy vấn Tham số X nhưng bạn chỉ bị ràng buộc Y

Quá nhiều tham số: truy vấn xác định X thông số và bạn bị ràng buộc Y

+0

trong điều kiện đặt ra câu lệnh if làm cách nào để bạn chuyển giá trị trường? có lẽ bạn ghi đè tham số đầu tiên. – Matteo

+0

đó chỉ là một ví dụ, xem câu trả lời của tôi bên dưới – ShinDarth

Trả lời

6

giải pháp sạch cho vấn đề này tôi đã tìm thấy cho đến nay, là để bọc tất cả các thông số bên trong một mảng và sau đó gọi một lần duy nhất phương pháp setParameters(), kiểm tra nếu có ít nhất là một tham số để thiết lập:

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb = $qb 
    ->select('SOMETHING') 
    ->from('SOMEWHERE') 
    ->where('SOME CONDITIONS') 

$parameters = []; 

if (SOME CHECK) { 
    $qb 
     ->andWhere('field1 = :field1') 
     ->andWhere('field2 = :field2'); 

    $parameters['field1'] = $myFieldValue1; 
    $parameters['field2'] = $myFieldValue2; 

} else { 
    $qb->andWhere('field1 = :field1'); 
    $parameters['field1'] = $myOtherFieldValue1; 
} 

if (count($parameters)) { 
    $qb->setParameters($parameters); 
} 
+0

Mã ban đầu của bạn có vẻ như nó sẽ hoạt động. Tôi làm điều đó tất cả các thời gian ngoại trừ tôi sử dụng setParameter thay vì setParameters. Có thể thử sử dụng các lệnh gọi setParameter riêng lẻ. Thật là xấu hổ khi phải phá vỡ tổ chức. – Cerad

0

bạn có thể thiết lập các thông số từng người một:

$qb 
    ->setParameter('field1', $value1) 
    ->setParameter('field2', $value2); 

bằng cách này bạn sẽ chắc chắn rằng bạn không ghi đè params khác với setParameters .

+0

không hoạt động với vị trí theo OP. – RichieHH

+0

@RichieHH - nó hoạt động với vị trí trong mã của tôi – luchaninov

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