Aktualize každého řádku v db tabulce (best practice)
- blaztar
- Člen | 93
Ahoj,
chtěl bych se zeptat. Není to tedy nic specificky zasazené do Nette, ale jsou zde moudří lidé tak se ptám tu. :)
Mám tabulku produktů (do 500 záznamů). Pomocí js knihovny je možné měnit pořadí. Ten mi vrátí pole idček nově seřazeného listu.
Prvně načtu všechny produkty ve správném pořadí (order by field).
Následně je výhodnější updatovat ve foreach cyklu každý řádek a určit
mu novou pozici nebo to převést na pole, přepsat hodnoty v poli, vymazat
celou tabulku a vložit nové data?
ps:
Používám Nette Database.
Tabulka má sloupce: name, text, prize, perex, image, inserted, deleted,
created, position.
Počet produktů do 500, žádné cizí klíče apod.
Editoval blaztar (1. 12. 2015 10:42)
- CZechBoY
- Člen | 3608
Já bych měnil v db jen toho se změnilo.
Na začátku bych nastavil position ke všem měněným produktum na null (pokud
tam máš unikátní klíč).
Potom nastavil novou hodnotu přes cyklus třeba, to bude pohodlnější než to
ifovat v query. Případně přes db proceduru, který nějak predas
všechny data.
- David Matějka
- Moderator | 6445
Slo by to asi treba takhle
SET @position := 0;
UPDATE product
SET position = (SELECT @position := @position + 1)
ORDER BY FIELD(id, 4, 3, 2, 1)
A pokud to budes chtit delat vic dotazama, tak je alespon uzavri do transakce, tim dost zrychlis jejich provadeni
- CZechBoY
- Člen | 3608
Tak si porovnej starou hodnotu s aktuální a podle toho se rozhodni.
http://stackoverflow.com/…-input-value
- blaztar
- Člen | 93
David Matějka napsal(a):
Slo by to asi treba takhle
SET @position := 0; UPDATE product SET position = (SELECT @position := @position + 1) ORDER BY FIELD(id, 4, 3, 2, 1)
A pokud to budes chtit delat vic dotazama, tak je alespon uzavri do transakce, tim dost zrychlis jejich provadeni
To vypadá super ten SQL příkaz. Teď jen jak ho zapsat v Nette. (Nette Database)
Díky za tip na transakce, když nepřijdu jak zapsat ten tvůj kód použij toto.
Editoval blaztar (1. 12. 2015 11:04)
- David Matějka
- Moderator | 6445
asi to budes muset poslat do query()
, zkus to takhle:
$this->db->query('SET @position := 0');
$this->db->query('UPDATE product
SET position = (SELECT @position := @position + 1)
ORDER BY FIELD(id, ?)', [1,2,3,4]);
- blaztar
- Člen | 93
David Matějka napsal(a):
asi to budes muset poslat do
query()
, zkus to takhle:$this->db->query('SET @position := 0'); $this->db->query('UPDATE product SET position = (SELECT @position := @position + 1) ORDER BY FIELD(id, ?)', [1,2,3,4]);
Výborný, funguje to dobře. Díky za pomoc.