MySQL Update mit Symfony

Es gibt mehrere Möglichkeiten mit dem PHP Framework Symfony mehrere Zeilen einer Datenbank (in unserem Fall MySQL) zu updaten.

Nehmen wir den Befehl:

UPDATE user SET active=0 WHERE password=1234

Die erste (und offensichtliche) Möglichkeit lautet, alle User mit dem Passwort ’1234′ mithilfe eines Criteria auszulesen – um dann mittels einer foreach Schleife einzelnt die Datensätze durchlaufen und upzudaten.

Allerdings verbraucht diese Möglichkeit unnötig viel Resourcen, weil X+1 SQL-Querys ausgeführt werden.

Um dieses zu vermeiden, gibt es einen schöneren Weg über die BasePeer Class von Symfony:

$con = Propel::getConnection();

// — Select Anweisung (steht also im WHERE Teil)
$c_select = new Criteria();
$c_select->add(UserPeer::ACTIVE, 0);

// — Eigentliche Update Anweisung
$c_update = new Criteria();
$c_update->add(UserPeer::PASSWORD, 1234);

BasePeer::doUpdate($c_select, $c_update, $con);

Mittels diesen kleinen Symfony Snippets ist es also Möglich, schnell mehrere Zeilen in einer Tabelle Resourcen schonend  zu updaten.

Im oberen Beispiel wird nämlich genau 1 Query ausgeführt. Also haben wir eine Erspannis von X MySQL- Querys.

5 Gedanken zu “MySQL Update mit Symfony

  1. Hallo,

    bei der Erklärung verstehe ich das Problem nicht ganz:
    Wenn
    UPDATE user SET active=0 WHERE password=1234
    die Aufgabenstellung ist, dann wird das doch bereits mit genau diesem Statement ausgeführt. Wozu also jeden einzelnen Datensatz einlesen und dann erst updaten?

    Gruss

  2. Damit man NICHT jeden Datensatz einzeln auslesen muss, gibt es ja die Methode mit “BasePeer”.

  3. gut, dann formuliere ich es mal um:
    Wenn ich die Query
    UPDATE user SET active=0 WHERE password=1234
    ausführe, dann werden doch bereits alle Datensätze, die das WHERE-Kriterium erfüllen, upgedatet. Von daher verstehe ich nicht, was der Einsatz von BasePeer vereinfachen soll, zumal es für dieses Beispiel ja nur zusätzlichen Aufwand bedeutet.

    Gruss

  4. Richtig, man könnte den Query so absenden – jedoch wäre es eben dann nicht der von Symfony angedachte weg.

    Zusätzlich wäre ein Problem gegeben, wenn sich die Spaltennamen ändern – dann müsste man mit der “direkten Query”-Methode den Quelltext an X stellen ändern.

    Mit der Symfony Methode nur an einer.

  5. Sorry für den späten Kommentar. Mir scheint im Gegensatz zu deiner angeführten Beispiel-Query macht dein Symfony-Code was anderes:

    UPDATE user SET password=1234 WHERE active=0;

    $c_select und $c_update werden bei der Deklaration mit vertauschten Inhalten belegt.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>