Nechci LEFT JOIN, nechci 2× dotazy kvůli stránkování
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Kcko
- Člen | 468
Ahoj,
SQL:
$selection = $this->model->findAll();
if ($category !== NULL)
{
$selection->where("clanky_kategorie.seo_nazev", $category);
}
Mi vytvoří
SELECT `clanky`.`id`, `clanky`.`clanky_kategorie_id`, `clanky`.`seo_datum`, `clanky`.`seo_nazev`,
`clanky`.`nazev`, `clanky`.`vydano`, `clanky`.`perex`
FROM `clanky`
LEFT JOIN `clanky_kategorie` ON `clanky`.`clanky_kategorie_id` = `clanky_kategorie`.`id`
WHERE (`clanky_kategorie`.`seo_nazev` = 'PHP')
ORDER BY `vydano` DESC
LIMIT 6
Moje otázka zní jak NDTB donutit, aby použila prostý JOIN a nikoliv LEFT JOIN. Vím, že v tomto případě LEFT JOIN nikdy potřebovat nebudu, v dokumentaci jsem o tom nic nenašel.
Druhá moje otázka zní.
V mém vlastním CMS jsem používal dibi.
Kvůli stránkování jsem nikdy nepokládal 2 dotazy, ale použil jsem SQL_CALC_FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS FROM tabulka 1 JOIN tabulka WHERE GROUP HAVING LIMIT // subselekty atd.
Nevím jak toho docílit v Nette, používam způsob Lazy a někde jsem se dočetl, že k „vykonání dotazu“ slouží „rewind“. Pokud jsem tedy měl něco jako, tak se to chovalo hrozně divně, vykonaný dotaz dle ověření v DB vrátil správné řádky, ale šablona vypisovala jen 2. Můžu se tedy zeptat, jak správně řešit stránkování v Nette? Nechci pokládat 2 dotazy a SQL_CALC_FOUND_ROWS asi používám špatně.
Díky
$filters = array('per_page' => 6,
'page' => $this->page);
$selection = $this->model->findAll()->select("SQL_CALC_FOUND_ROWS *");
if ($category !== NULL)
{
$selection->where("clanky_kategorie.seo_nazev", $category);
}
$selection->page($filters["per_page"], $filters["page"]);
$this->template->posts = $selection;
$this->template->posts->rewind();
$totalRows = // FOUND_ROWS(); a další věci pak předáváné do šablony