2010-12-27 24 views
9

Đây là DQL-queryLàm thế nào để đối phó với "IN" trong mệnh đề where trong Doctrine2

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
    $q = $em->createQuery($dql) 
       ->setParameter(1, '108919,108920'); 
    $result = $q->execute(); 

nếu tôi vượt qua các thông số thông qua học thuyết setParameter trả về kết quả chỉ đầu tiên, nhưng nếu tôi đặt chúng trực tiếp vào DQL -query nó trả về 2 kết quả (điều này là chính xác):

$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)"; 

Làm thế nào để đối phó với "IN" trong mệnh đề WHERE qua setParameter?

Trả lời

0

Giải pháp 1:

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1, ?2)"; 
$q = $em->createQuery($dql) 
->setParameters(array(1 =>'108919', 2 => '108920')); 
$result = $q->execute(); 

Giải pháp 2 (thêm thanh lịch):

$parameters = array(1 =>'108919', 2 => '108920'); 
$dql = 'SELECT t Entities\Table t WHERE t.field IN (?'.implode(', ?', array_keys($parameters)).')'; 
$q = $em->createQuery($dql) 
->setParameters($parameters); 
$result = $q->execute(); 
1

Sau đây nên làm việc như mong đợi (đối với một numer độc đoán của đối số mệnh đề IN)

$params = array(1 => 108919, 2 => 108920); 
$qb = $em->createQueryBuilder(); 
$qb->select(array('t')) 
    ->from('Entities\Table', 't') 
    ->where($qb->expr()-> in('t.field', array_map(function($p) { return '?'.$p; }, array_keys($params))) 
    ->setParameters($params); 
$q = $qb->getQuery(); 
$r = $q->getResult(); 
6

Sau đây sẽ hoạt động tốt:

$searchParameters = array(108919, 108920); 

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
$q = $em->createQuery($dql) 
    ->setParameter(1, $searchParameters); 

$result = $q->execute(); 

Bạn có thể chuyển vào mảng, không sử dụng implode() và học thuyết sẽ xử lý đúng (như danh sách số nguyên).

Lưu ý: nếu bạn đã làm việc với chuỗi '108919, 108920' - bạn sẽ cần phải sử dụng chức năng phát nổ và cắt.

này cũng được đề cập ở đây: How to use the in statement in DQL in Doctrine 2.0

+0

này làm việc cho tôi và vì vậy tôi sẽ giả định là câu trả lời đúng cho câu hỏi này. –

+0

asker nên đã chấp nhận điều này .. cảm ơn cho câu trả lời .. :) – ihsan

9

Hãy nhận biết rằng điều này chỉ làm cho các thông số được đánh số, và không có tên tham số.

$searchParameters = array(108919, 108920); 

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)"; 
$q = $em->createQuery($dql) 
    ->setParameter(1, $searchParameters); 

$result = $q->execute(); 
+2

Tôi đã rách tóc ra cố gắng tìm ra lý do tại sao tôi không thể nhận được tham số mảng để làm việc - thay thế được đặt tên tham số với số được lưu ngày của tôi :-) –

+1

Tôi chỉ cần đi qua câu hỏi này và thử nó với một tham số được đặt tên anyway. Có vẻ như một nơi nào đó giữa câu trả lời này và bây giờ, Doctrine đã được thay đổi để cho phép xây dựng này cho các tham số được đặt tên là tốt. –

0

này đang làm việc

public function searchCategory($target){ 

     $query = $this->getEntityManager() 
        ->createQuery("SELECT ct.id as id,ct.name as name, ct.target as target FROM LoveThatFitAdminBundle:ClothingType ct WHERE ct.target IN (:target)") 
        ->setParameter('target',$target['target']); 
        try { 
        return $query->getResult(); 
       } catch (\Doctrine\ORM\NoResultException $e) { 
       return null; 
       } 

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