Zadejte hledaný výraz...

Který způsob je správný / lepší?

Bacon
verified
rating uzivatele
(2 hodnocení)
29. 5. 2013 01:14:57
Zdravím,
právě se potýkám s menším problémem při práci se stromovou strukturou (kategorie). Dejme tomu, že mám kategorie v tomto pojetí:
1 kategorie
1.1 podkategorie
1.1.1 podkategorie podkategorie
1.1.1.1
Z důvodu úspory SQL požadavků jsem se rozhodl "path" jednotlivých uzlů ukládat přímo v databázi, takže sloupec path vypadá následovně:
kategorie
kategorie/podkategorie
kategorie/podkategorie/podkategorie podkategorie
Sloupec path je vázán na callback afterSave(), který se vykoná po každém uložení položky do databáze, při beforeSave() mi to nefungovalo, jak jsem chtěl.
"Problém" je v tom, že při změně kategorie, která má pod sebou child prvky, dojde ke změně i jejich path, takže se to musí řešit řetězově. A mě zajímá, zda je správnější zápis tento:
public function updateCategoryPath( $categoryId ) {
// sestavíme path aktuální kategorie
$this->data = $this->buildCategoryPath( $this->id );
// uložíme, vypneme callback, aby nedošlo k zacyklování
$this->save( $this->data, array( 'callbacks' => false ) );
// získáme podkategorie aktuální kategorie
$children = $this->children( $this->id );
// a proženeme funkcí,...
foreach ( $children as $child ) {
// ... která zavolá buildCategoryPath
$this->id = $child;
$this->data = $this->buildCategoryPath( $this->id );
// a po obdržení cesty prostě uloží záznam
$this->save( $this->data, array( 'callbacks' => false ) );
}
}
// tato funkce má na starosti POUZE sestavení cesty, data neukládá, atd.
public function buildCategoryPath( $categoryId ) {
$categoryPath = $this->getPath( $categoryId );
$categoryPath = Hash::extract( $categoryPath, '{n}.Category.name' );
$categoryPath = serialize( $categoryPath );
return $categoryPath;
}
nebo
public function updateCategoryPath2( $categoryId ) {
$this->id = $categoryId;
// přímo v této funkci získám cestu k aktuální kategorii
$categoryPath = $this->getPath( $this->id );
$categoryPath = Hash::extract( $categoryPath, '{n}.Category.name' );
$categoryPath = serialize( $categoryPath );
$this->data = $categoryPath;
// a uložím ji
$this->save( $this->data, array( 'callbacks' => false ) );
// hned vzápětí získám potomky aktuální kategorie (POUZE PŘÍMÉ!)
$children = $this->children( $this->id, true );
// projedu je cyklem...
foreach( $children as $child ) {
// ... a odkážu na sebe sama (updateCategoryPath)
$this->id = $child;
$this->updateCategoryPath2( $this->id );
}
}
V druhé variantě získávám pouze přímé potomky z toho důvodu, že při dalším průběhu funkcí se samotný potomek opět dotazuje na potomky.
Použití updateCategoryPath = 31 queries
Použití updateCategoryPath2 = 33 queries
(Při změně elementu, který má 3 potomky, struktura na začátku příspěvku.)
Co je podle vás správný zápis? Mně osobně se líbí ta verze první, funkce, která data upravuje je oddělena od funkce, která zapisuje a tak je možné ji znovu využít v případě potřeby.
29. 5. 2013 01:14:57
https://webtrh.cz/diskuse/ktery-zpusob-je-spravny-lepsi#reply906428
Macejko.sk
verified
rating uzivatele
(5 hodnocení)
29. 5. 2013 02:24:09
Vseobecne je lepsie rozdelovat funkcie na najmensie funkcne celky. Aneb, dostali sa mi mudrosti, ze ak nevies popisat funkciu bez toho aby si pouzil vo vete "a", tak je takto funkcia zle navrhnuta (neplati nutne). Takze stale ak mozes rozdeluj na mensie funkcie, ktore mozu byt pouzite viac krat. Lepsie sa kod udrzuje a cita.
Este jedna malickost, aj mas pomocnu funkciu, ktora operuje len vo vnutri Class, bez toho aby si ju pozival, respektive volal z vonku, tak ju daj ako private. Jednoducho dodrzuj zapouzdrenost.
edit:
tych 33 query dotazov nakesuj, nepredpokladam ze sa tie kategorie budu casto menit, takze nakoniec budes mat ich 0 :)
29. 5. 2013 02:24:09
https://webtrh.cz/diskuse/ktery-zpusob-je-spravny-lepsi#reply906427
Bacon
verified
rating uzivatele
(2 hodnocení)
29. 5. 2013 02:38:05
Děkuji za radu! :)
Co se cachování týče, to si CakePHP řeší samo. Ty dotazy se vykonávají pouze při změně některé kategorie, tedy v backendu. Ve frontendu je díky tomuto způsobu zapisování cesty přímo do databáze potřeba pro výpis kategorií z 9 dotazů jen jeden.
29. 5. 2013 02:38:05
https://webtrh.cz/diskuse/ktery-zpusob-je-spravny-lepsi#reply906426
Pro odpověď se přihlašte.
Přihlásit