Opakované použití Nette\Database\Table\Selection::update()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
fary
Člen | 155
+
0
-

Nevím, jestli něco nedělám špatně, ale když zapíšu:

Mám SQL:

CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
);

INSERT INTO `users` (`id`, `name`) VALUES
(1, 'Nobody 1'),
(2, 'Nobody 2');

Pak mám PHP: ($table je Nette\Database\Table\Selection)

$res = $table->wherePrimary(1)->update(array('name', 'John Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // OK

$res = $table->wherePrimary(2)->update(array('name', 'Jane Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // Fail

V prvním případě se vypíše OK, ve druhém Fail v případě, že $table je stejná instance jako v prvním případě. Nevím jestli něco nedělám špatně, ale myslím, že v obou případech by se mělo vypsat OK.

David Matějka
Moderator | 6445
+
0
-

Vsechny where se do selection pridavaji, selection je (vetsinou) jen pro jeden dotaz. Bud tedy pouzij nove selection, nebo zavolej metodu get(1), ktera vrati odpovidajici ActiveRow, aniz by to ovlivnilo puvodni selection

Editoval matej21 (17. 5. 2014 23:33)

hrach
Člen | 1844
+
0
-

jak pise spravne matej:

$res = $table->get(1)->update(array('name', 'John Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // OK

$res = $table->get(2)->update(array('name', 'Jane Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // will be OK
fary
Člen | 155
+
0
-

Díky. Udělal jsem si metodu getTable() díky které mohu použít:

$res = getTable()->wherePrimary(1)->update(array('name', 'John Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // OK

$res = getTable()->wherePrimary(2)->update(array('name', 'Jane Doe'));
echo $res > 0 ? 'OK' : 'Fail'; // OK
hrach
Člen | 1844
+
0
-

jo, ale principialne je to spis spatne a zbytecne. je lepsi clonovat, respektive mit vice obejktu, activerow, nez selection.