Převod dotazu na nette db table

Kcko
Člen | 465
+
0
-

Nedokážu to zapsat v NDT, takže jsem to takhle „zprasil“.

<?php
		$this->connection->query('UPDATE product_parameter_codelist_lang
			SET value = REPLACE(value, ?, ?)
			WHERE value LIKE ?', 'litrů', 'l', '%litrů%');

		$this->connection->query('UPDATE product_parameter_codelist_lang
			SET value = REPLACE(value, ?, ?)
			WHERE value LIKE ?', 'litru', 'l', '%litru%');

?>

Nevymyslel jsem jak narvat REPLACE do updatu jako do pole.

Lze to vůbec?

Kamil Valenta
Člen | 765
+
+3
-

Ano, jako SQL literal.

kminekmatej
Generous Backer | 34
+
+1
-

Asi nějak takto

        $this->connection->table("product_parameter_codelist_lang")
            ->where("value LIKE ?", "%litru%")
            ->update([
                "value" => new \Nette\Database\SqlLiteral("REPLACE(value, ?, ?)", ['litru', 'l'])
        ]);
Kcko
Člen | 465
+
0
-

Díky oboum, na SQL literal jsem už úspěšně zapomněl :-)

David Grudl
Nette Core | 8172
+
+2
-

Btw to WHERE je zbytečné, ne?

Kcko
Člen | 465
+
+1
-

David Grudl napsal(a):

Btw to WHERE je zbytečné, ne?

Je :/

David Matějka
Moderator | 6445
+
+1
-

@DavidGrudl v MySQL je to asi zbytečný, ale třeba v postgresql se to bez where bude chovat jinak – kvůli mvcc by to zapsalo novou verzi řádku pro všechny záznamy bez ohledu na to, zda se hodnota změnila (a mj by to tak mohlo způsobit kolize s konkurenční transakcí)

David Grudl
Nette Core | 8172
+
0
-

@DavidMatějka aha. Nevíš, jestli by to udělalo i SET value = value?

David Matějka
Moderator | 6445
+
+3
-

@DavidGrudl jj, i toto

test script:

CREATE TABLE foo
(
	id    UUID NOT NULL,
	value TEXT
);
INSERT INTO foo(id, value) VALUES (gen_random_uuid(), 'some_value');

SELECT *, ctid FROM foo;
UPDATE foo SET value = value;
SELECT *, ctid FROM foo;

uvidis, ze se zmenilo „ctid“, coz je

The physical location of the row version within its table. Note that although the ctid can be used to locate the row version very quickly, a row's ctid will change if it is updated or moved by VACUUM FULL.