2013-11-28 16 views
5

voglio impostare nulla a un campo nella dottrina e qui è la fraseCome aggiornare un campo in dottrina per impostare nullo

$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(); 

penso che questo codice dovrebbe fare il lavoro, ma nel mese di ottenere questo eccezione

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»

prima di tutto perché la dottrina sta aggiungendo che E (example.deleted_at IS NULL) sto facendo qualcosa di sbagliato?

+0

Credo che l'errore sta nel "$ ids" variabile che non sembra essere un array ... – santamanno

risposta

0

è necessario modificare questo

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

in

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

naturalmente $ id deve essere un array e non una stringa.

+0

grazie @DonCastillo che era veloce come un fulmine, ho cambiato la frase a questo $ query = '$ qb -> update ($ entity_name, 'u') -> set ('u.deletedAt', ': deletedAt') -> dove ($ qb-> expr() -> in ("u. $ id_name", $ id)) -> setParameter ('deletedAt', null) -> getQuery(); ' ma isnt di lavoro, ora si pretende gettare alcuna eccezione, ma è la costruzione di una query Extrange dare un'occhiata ' esempio UPDATE SET deleted_at =? DOVE (id IN ('5', '6')) AND (esempio.deleted_at IS NULL) ' da dove la dottrina ottiene quella frase IS NULL? – metalvarez

+0

'-> set ('u.deletedAt', ': deletedAt')' da qui in realtà – DonCallisto

0

il problema è che $ id è una stringa. si può fare:

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

e dopo in voi Query di aggiornamento:

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

ho provato la tua soluzione @Anime ma la dottrina sta ancora costruendo una query estranea dai uno sguardo 'Esempio UPDATE SET deleted_at =? WHERE (id IN ('5', '6')) AND (esempio.deleted_at IS NULL) ' – metalvarez

5

tua query originale sembra che dovrebbe funzionare. Ho duplicato e testato con:

$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(); 

Funziona come previsto.

Sei sicuro di aver copiato/incollato il codice esatto? Nessuna modifica dopo il fatto? Verifica che l'array ids sia in realtà un array di numeri interi. Questo è l'unico punto in cui ho potuto vedere dove potrebbe esserci un problema. E assicurati che il tuo errore provenga dal codice che hai postato. Forse sta succedendo qualcos'altro? Prova ad isolare il tuo codice in un oggetto comando. E ovviamente cancellato, ha il valore nullable impostato su true?

Per questo caso non è necessario utilizzare l'oggetto expr. Doctrine 2 gestisce correttamente gli array per le istruzioni IN.

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

ho il sospetto di avere $ ids = '5,6'? Prova a impostarlo su: $ ids = array (5,6); Anche se con una stringa non vedo come sta rovinando la query.

1

grazie a @Cerad il problema era che stavo usando l'estensione soft-delete da StofDoctrineExtensionsBundle e il bundle stava aggiungendo il filtro di eliminazione soft, quindi ho semplicemente disabilitato il filtro di eliminazione soft e ora funziona come previsto, pubblicando la soluzione molti Grazie.

$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); 
Problemi correlati