Aktualize každého řádku v db tabulce (best practice)

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

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
+
0
-

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.

blaztar
Člen | 93
+
0
-

Jo díky za další tip.

A kdyby bylo na výběr jen mezi tím co jsem psal? Teď mi javascript funkce vrátí pole IDček seřazených podle nového pořadí (nezkoušel jsem to nějak upravovat, aby to vracelo něco jiného), takže nepoznám co bylo upraveno a co ne.

David Matějka
Moderator | 6445
+
+1
-

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
+
0
-

Tak si porovnej starou hodnotu s aktuální a podle toho se rozhodni.
http://stackoverflow.com/…-input-value

blaztar
Člen | 93
+
0
-

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
+
+2
-

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
+
0
-

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.