Router::filter_out robí 200 queries

5 years ago

iNviNho
Member | 354
+
0
-

Jednoduchá tabuľka kategorií, ktorá má id_kat, nazov … url

Nastavil som si routu, ktorá funguje

<?php
$router[] = new Route('[<lang [a-z]{2}(?<!sk)>/]produkty/kategoria[/<id>]', array(
                'lang' => 'sk',
                'presenter' => 'produkty',
                'action' => 'kategoria',
                'id' => array(
                                Route::FILTER_IN => function ($id) {
                                    if (is_numeric($id)) {
                                        return $id;
                                    } else {
                                        $vysledok = dibi::query("SELECT id_kat FROM kategorie where url=%s",$id)->fetchSingle();

                                        return $vysledok;
                                    }
                                },
                                Route::FILTER_OUT => function ($id) {
                                    if (!is_numeric($id)) {
                                        return $id;
                                    } else {
                                        $vysledok = dibi::query("SELECT url FROM kategorie where id_kat=%i",$id)->fetchSingle();

                                        return $vysledok;
                                    }
                                })));
?>

Avšak nerozumiem tomu, ale ked sa pozriem do queries, tak tam vidim 360 queries do samotnej databáze a vyzerajú presne ako queries, ktoré su v Route::filter_out, niektoré sa tam dokonca opakujú …

Ak túto routu komentnem, tak sa mi zmenší počet queries na 179 (tie už súvisia s app) …

Napríklad ak som v kategorií s ID 53, tak sa to isté query opakuje vo filtre cca 30×

Naozaj tomu nerozumiem

5 years ago

enumag
Member | 2128
+
0
-

Filter out se volá vždy když pomocí dané routy vytváříš odkaz. Je třeba to nějak cachovat.

Chystám úplně jiný způsob řešení, ale to asi nebude pro dibi.

5 years ago

iNviNho
Member | 354
+
0
-

Ďakujem, ja som to v ten den vyriešil a som na to zabudol.

Moje riešenie :

<?php
$kat =  dibi::query("SELECT id_kat, url FROM kategorie")->fetchPairs("id_kat","url");

        $router = new RouteList();
        $router[] = new Route('[<lang [a-z]{2}(?<!sk)>/]produkty/kategoria[/<id>]', array(
                'lang' => 'sk',
                'presenter' => 'produkty',
                'action' => 'kategoria',
                'id' => array(
                                Route::FILTER_IN => function ($id) {
                                    if (is_numeric($id)) {
                                        return $id;
                                    } else {
                                        $vysledok = dibi::query("SELECT id_kat FROM kategorie where url=%s",$id)->fetchSingle();

                                        return $vysledok;
                                    }
                                },
                                Route::FILTER_OUT => function ($id) use ($kat) {
                                    if (!is_numeric($id)) {
                                        return $id;
                                    } else {

                                        $vysledok = $kat[$id];

                                        return $vysledok;
                                    }
                                })));

?>

5 years ago

enumag
Member | 2128
+
0
-

Mohl by někdo z moderátorů přesunout tohle vlákno do české verze fóra?

5 years ago

Jan Tvrdík
Nette guru | 2549
+
0
-

@enumag: Ne, můžu ho akorát smazat jako spam.