2013-11-28 7 views
5

ich auf ein Feld setzen in der Lehre null will und hier ist der SatzWie ein Feld in der Lehre zu aktualisieren, es zu setzen 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(); 

ich denke, dass dieser Code die Arbeit machen soll, aber im dies immer Ausnahme

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»

vor allem warum Lehre, dass und das Hinzufügen wird (example.deleted_at IS NULL) bin ich etwas falsch?

+0

Ich denke, der Fehler liegt in dem „$ ids“ Variable, die scheint nicht ein Array zu sein ... – santamanno

Antwort

0

Sie haben diese $ ids

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

in

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

natürlich ändern muss ein Array und kein String sein.

+0

dank @DonCastillo dass blitzschnell war, änderte ich den Satz zu diesem '$ query = $ qb -> update ($ entity_name, 'u') -> setzen ('u.deletedAt', ': deletedAt') -> wo ($ qb-> expr() -> in ("u. $ id_name", $ ids)) -> setParameter ('deletedAt', null) -> getQuery(); ' aber es ist nicht funktioniert, jetzt tut es jede Ausnahme werfen, sondern baut eine Extrange Abfrage werfen sie einen Blick ' UPDATE Beispiel SET gelöschte_at =? WHERE (id IN ('5', '6')) UND (Beispiel.deleted_at IST NULL) ' woher Lehre bekommt, dass NULL Satz ist? – metalvarez

+0

'-> set ('u.DeletedAt', ': deletedAt')' von hier tatsächlich – DonCallisto

0

das Problem ist, dass Sie $ ids eine Zeichenfolge ist. Sie können machen:

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

und in Ihnen nach Abfrage aktualisieren:

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

Ich versuchte Ihre Lösung @Anime aber Lehre ist immer noch eine extrange Abfrage erstellen werfen Sie einen Blick 'UPDATE Beispiel SET deleted_at =? WHERE (ID IN ('5', '6')) AND (BeispielDeleted_at ist NULL) ' – metalvarez

5

Ihre ursprüngliche Abfrage sieht aus wie es funktionieren sollte. Ich dupliziert und getestet mit:

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

Funktioniert wie erwartet.

Sind Sie sicher, dass Sie Ihren genauen Code kopiert/eingefügt haben? Keine Bearbeitung nach der Tat? Stellen Sie sicher, dass Ihr ID-Array wirklich ein Array von ganzen Zahlen ist. Das ist der einzige Ort, wo ich sehen könnte, wo ein Problem sein könnte. Und stellen Sie sicher, dass Ihr Fehler von dem Code kommt, den Sie gepostet haben. Vielleicht geht etwas anderes vor? Versuchen Sie, Ihren Code in einem Befehlsobjekt zu isolieren. Und natürlich deletedAt hat es NULL-Wert auf True gesetzt?

Es gibt keine wirkliche Notwendigkeit, das Objekt expr für diesen Fall zu verwenden. Doctrine 2 behandelt Arrays für IN-Anweisungen korrekt.

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

Ich vermute, Sie $ ids haben = '5,6'? Versuchen Sie es zu setzen: $ ids = array (5,6); Obwohl ich selbst mit einer Zeichenfolge nicht sehe, wie es die Abfrage durcheinander bringt.

1

danke @Cerad das Problem war, dass ich die Soft-Delete-Erweiterung von StofDoctrineExtensionsBundle verwendet und das Bündel den Soft-Lösch-Filter hinzugefügt wurde, so habe ich nur den Soft-Lösch-Filter deaktiviert und jetzt funktioniert es wie erwartet, die Lösung viele Vielen Dank.

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