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.
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.
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
Damit man NICHT jeden Datensatz einzeln auslesen muss, gibt es ja die Methode mit “BasePeer”.
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
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.
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.