Hromadný update záznamů v multidimenzionálním poli

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

Ahoj, řeším s Nette hromadné vkládání/aktualizace potencionálně mnoha záznamů. Hromadný insert jsem vyřešil, ale snažil jsem se podobným způsobem vyřešit i update. To se mi ale nepovedlo. Proto prosím o radu, zda je něco takového možné (doufám že ano, když hromadný insert existuje).

Zde je způsob jak jsem se snažil o update – vyhazuje sql chybu

foreach($items as $item){
$upd[] = [
	'name' => $item['name'],
	'surname' => $item['surname']
];
}
$this->database->table('tbl')->update($upd);

Nacpal bych do toho foreache ten vlastní update ale tomu jsem se chtěl nějak vyhnout.

Děkuji všem za pomoc.

Mysteria
Člen | 797
+
0
-

Co je cílem? Ten kód nedává smysl minimálně z toho důvodu, že zavolání UPDATE bez podmínky přepíše všechny řádky tabulky, takže i kdyby se ten UPDATE přesunul do toho foreache, tak všechna data budou mít hodnotu poslední položky v $items, jinak do ->update by mělo přijít jenom jednoduché pole s novýma hodnotama a né pole s vnořenými poli s novýma hodnotama.

Co se týká optimalizace rychlosti, tak je stačí spustit v transakci, to by mělo jejich vykonání znatelně urychlit.

trta911
Člen | 35
+
0
-

popíšu to jinak – přesněji.

Mám xml feed se zbožím. No a potřebuju nové produkty uložit do db – to výše popsaným způsobem funguje. Ale pokud potřebuju na základě změny některých parametrů příslušné produkty změnit (cena, dostupnost,.....) tak jsem se snažil to vyřešit stejným způsobem (návyk z Codeigniteru a Datamapperu) a to nejde. Produkty právě iteruji foreachem a tak jako náhradní řešení mě napadlo přímo dát update dotaz do toho cyklu. Chápu, že to asi není ideál ale nic lepšího mě v tuhle chvíli nenapadá.

Myslel jsem to takto:

foreach ($x as $item)
{
$upd = [
    'name' => $item['name'],
    'surname' => $item['surname']
];
	$this->database->table('tbl')->where('id',$item['id'])->update($upd);
}