2013-11-28 19 views
5

Tôi muốn thiết null tới một lĩnh vực trong giáo lý và đây là câuLàm thế nào để cập nhật một trường trong học thuyết để thiết lập nó null

$em = $this->getDoctrine()->getManager(); 
$qb = $em->createQueryBuilder(); 
$query = $qb->update('Model\Example', 'u')->set('u.deletedAt', ':deletedAt') 
->where("u.id IN (:ids)")->setParameter('deletedAt', null) 
->setParameter('ids', $ids) 
->getQuery(); 
$query->execute(); 

tôi nghĩ rằng mã này nên thực hiện công việc, nhưng im nhận này ngoại lệ

An exception occurred while executing 'UPDATE example SET deleted_at = ? WHERE (id IN (?)) AND (example.deleted_at IS NULL)' with params [null, "5,6"]: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: la sintaxis de entrada no es válida para integer: «5,6»

trước hết lý do tại sao lại thêm VÀ (ví dụ.deleted_at IS NULL) tôi đang làm gì sai?

+0

Tôi nghĩ rằng lỗi nằm trong "$ id" biến mà dường như không có một mảng ... – santamanno

Trả lời

0

Bạn cần phải thay đổi điều này

->where("u.id IN (:ids)")->setParameter('deletedAt', null) 

vào

->where($qb->expr()->in('sc.id',$ids)) 

tất nhiên $ id phải là một mảng và không phải là một chuỗi.

+0

nhờ @DonCastillo đó là nhanh như chớp, tôi đã thay đổi câu này '$ query = $ qb -> cập nhật ($ entity_name, 'u') -> set ('u.deletedAt', ': deletedAt') -> trong đó ($ qb-> expr() -> trong ("u. $ id_name", $ id)) -> setParameter ('deletedAt', null) -> getQuery(); ' nhưng nó isnt làm việc, bây giờ nó không ném bất kỳ ngoại lệ nhưng đang xây dựng một truy vấn extrange hãy xem 'Cập nhật: ví dụ SET deleted_at =? WHERE (id IN ('5', '6')) AND (ví dụ.deleted_at IS NULL) ' từ nơi học thuyết nhận được câu IS NULL đó? – metalvarez

+0

'-> set ('u.deletedAt', ': deletedAt')' từ đây thực sự – DonCallisto

0

vấn đề là bạn $ id là một chuỗi. bạn có thể làm:

$arrayOfIds = explode(",", $ids);

và sau khi bạn cập nhật trong truy vấn:

->setParameter('ids', $arrayOfIds) 
+0

tôi đã thử giải pháp của bạn @Anime nhưng học thuyết vẫn đang xây dựng một truy vấn phụ trội, hãy xem 'UPDATE example SET deleted_at =? WHERE (id IN ('5', '6')) AND (ví dụ.deleted_at IS NULL) ' – metalvarez

5

truy vấn ban đầu của bạn có vẻ như nó sẽ làm việc. Tôi đã sao chép và thử nghiệm với:

$em = $this->getService('doctrine.orm.entity_manager'); 
    $qb = $em->createQueryBuilder(); 

    $qb->update('Cerad\Bundle\PersonBundle\Entity\Person','person'); 

    $qb->set('person.verified',':verified'); 
    $qb->setParameter('verified',null); 

    $qb->where('person.id IN (:ids)'); 
    $qb->setParameter('ids',array(1,2,3)); 

    echo $qb->getQuery()->getSql(); // UPDATE persons SET verified = ? WHERE id IN (?) 

    $qb->getQuery()->execute(); 

Làm việc như mong đợi.

Bạn có chắc chắn đã sao chép/dán mã chính xác của mình không? Không chỉnh sửa sau khi thực tế? Xác minh mảng id của bạn thực sự là một mảng các số nguyên. Đó là chỗ duy nhất tôi có thể thấy nơi có thể có vấn đề. Và đảm bảo lỗi của bạn đến từ mã bạn đã đăng. Có thể cái gì khác đang xảy ra? Hãy thử cách ly mã của bạn trong một đối tượng lệnh. Và tất nhiên đã xóaĐã có nó là nullable đặt thành true?

Không có nhu cầu thực sự để sử dụng đối tượng expr cho trường hợp này. Doctrine 2 xử lý chính xác các mảng cho các câu lệnh IN.

====================================

Tôi nghi ngờ bạn có $ id = '5,6'? Hãy thử đặt nó thành: $ ids = array (5,6); Mặc dù ngay cả với một chuỗi Tôi không thấy làm thế nào nó messing lên truy vấn.

1

cảm ơn @Cadad vấn đề là tôi đang sử dụng phần mở rộng xóa mềm từ StofDoctrineExtensionsBundle và gói đã thêm bộ lọc xóa mềm, vì vậy tôi vừa tắt bộ lọc xóa mềm và bây giờ nó hoạt động như mong đợi, đăng nhiều giải pháp cảm ơn.

$em = $this->getDoctrine()->getManager(); 
$em->getFilters()->disable('softdeleteable'); // this was the problem when you use the soft delete extension you need to disable the filter if you want to reactivate deleted records 
$qb = $em->createQueryBuilder(); 
$qb->update('Model\Example', 'q'); 
$qb->set('q.deletedAt',':deletedAt'); 
$qb->setParameter('deletedAt',null); 
$qb->where("q.id IN (:ids)"); 
$qb->setParameter('ids', $ids); 
Các vấn đề liên quan