Převod dotazu na nette db table
- Kcko
- Člen | 468
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?
- kminekmatej
- Generous Backer | 38
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'])
]);
- David Matějka
- Moderator | 6445
@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 Matějka
- Moderator | 6445
@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.