2016-04-24 14 views
0

Ich versuche eine bestimmte Anzahl von Zeilen meiner Entity "Vecicule" zu aktualisieren. Ich habe keine Ahnung, wie es funktionieren könnte. Ich versuche tatsächlich, nur zwei Zeilen zu ändern, wo Richtung = 5. Dies ist die Funktion, die ich verwendet habe, um zu aktualisieren.Zufallsauswahl der Zeilenanzahl

public function ValidAction(\OC\UserBundle\Entity\User $direction) { 

    $qb = $this->getDoctrine() 
     ->getRepository('CarPfeBundle:Vehicule') 
     ->createQueryBuilder('v'); 

    $q = $qb->update ('CarPfeBundle:vehicule v') 
      ->set('v.direction', '?1') 
      ->where('v.direction = ?2') 
      ->setParameter(1, $direction) 
      ->setParameter(2, 5) 
      ->getQuery(); 

     $p = $q->execute(); 

    return $this->redirect($this->generateUrl('demandeveh_afficher')); 
} 

Aber der obige Code aktualisiert alle Zeilen meiner Datenbank. Ich muss nur zwei Zeilen aktualisieren. Irgendwelche Hilfe bitte?

+0

können Sie angeben, bitte die Zeilennummern? –

+0

Zeilen, die ich aktualisieren möchte? Eigentlich ist es zufällig, ich muss nur zwei zufällige Zeilen aktualisieren, die mit der WHERE-Anweisung angemessen sind. Ich habe versucht zu verwenden "update top (2) ..", aber es funktioniert nicht –

+0

Wenn das, versuchen Sie, zufällig alle 2 Vehicule zu finden: $ q = $ qb-> finden ($ vehiculeId); und modifiziere diese Vehicule –

Antwort

0

Versuchen Sie, dies zu tun;

public function ValidAction(\OC\UserBundle\Entity\User $direction) { 

    $qb = $this->getDoctrine() 
       ->getRepository('CarPfeBundle:Vehicule') 
       ->createQueryBuilder('v'); 

    // $ids an array that contains all ids with your condition 
    $ids = $qb->select('v.id') 
       ->where('v.direction = :direction') 
       ->setParameter(
        array(
         'direction' => $direction 
        ) 
       ) 
       ->getQuery() 
       ->getResult(); 

    $id1 = $ids[array_rand($ids)]; 
    $id2 = $ids[array_rand($ids)]; 

    //To be sure that $id1 is different from id2 
    while ($id1 == $id2) { 
     $id2 = $ids[array_rand($ids)]; 
    } 


    $q = $qb->update ('CarPfeBundle:vehicule v') 
      ->set('v.direction', ':val1') 
      ->where('v.direction = :val2') 
      ->andWhere('v.id IN (:id1, :id2)') 
      ->setParameter(
       array(
        'val1' => $direction , 
        'val2' => 5 , 
        'id1' => $id1, 
        'id2' => $id2, 
       ) 
      ) 
      ->getQuery(); 

    $p = $q->execute(); 

return $this->redirect($this->generateUrl('demandeveh_afficher')); 

}

Mit dem obigen Code Ich hoffe nur zwei Zeilen aktualisieren und zufällig.

Viel Glück!

+0

@Eya Behi, es funktioniert? –

0

Während eine Lösung wie Houssem Zitoun suggested funktioniert, warum nicht eine Unterabfrage verwenden?

Wenn Sie die (wie ich es tat, wenn nicht, einfach überspringen die mittlere SELECT)

Error: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

gehen mit this answer und so etwas wie (doc): - ungetestet

UPDATE CarPfeBundle:Vehicule v 
    SET v.direction = ?1 
    WHERE v.direction IN 
    (SELECT * FROM (
     SELECT v.direction 
     FROM CarPfeBundle:Vehicule v2 
     WHERE v.direction = ?2 LIMIT 2 
    )) AS sq 
Verwandte Themen