Bug v nette database selection
- Jack06
- Člen | 168
Nejprve všechny zdravím a předem děkuji za všechny reakce. Mám problém s NDB a počtem řádků, které mi zahlásí jako nalezené a které mi reálně vypíše.
Mám takovouto databázi:
CREATE TABLE IF NOT EXISTS `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dph_id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`price` float DEFAULT NULL,
`priceVat` float DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`isActive` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_product_dph1_idx` (`dph_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `product_page` (
`page_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
PRIMARY KEY (`page_id`,`product_id`),
KEY `fk_page_has_product_product1_idx` (`product_id`),
KEY `fk_page_has_product_page1_idx` (`page_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Soustava dotazů do databáze:
public function getSubcategoriesIds($pageId)
{
$page = $this->menuPageRepository->findAllByPage($pageId)->fetch();
$whereIn = $this->menuPageRepository->findAll()
->where('left_index >= ?', $page->left_index)
->where('right_index <= ?', $page->right_index)
->select('page_id');
return $whereIn;
}
public function getProductsByPage($pageId)
{
$whereIn = $this->getSubcategoriesIds($pageId);
$products = $this->pproductRepository->findAll()
->where(':product_page.page_id', $whereIn);
return $products;
}
Výsledný SQL vypadá takto a jak je vidět, hlásí 56 výsledků:
Když jsem si ale zkusil vypsat výsledky, tak mi to vypíše pouze 33 výsledků. Zkusil jsem si tedy vytvořit debug na 3 způsoby:
$products = $this->facade->getProductsByPage(1);
$couter = 0;
foreach($products as $product){
$counter++;
}
\Nette\Diagnostics\Debugger::dump($products->count('*')); // 56 výsledků, správně
\Nette\Diagnostics\Debugger::dump($products->count()); // 33 výsledků, špatně
\Nette\Diagnostics\Debugger::dump($counter); // 33 výsledků, špatně
exit;
Zkusil jsem smazat cache a zkusit to na první dobrou, ale výsledek je stejný. Děkuji za rady.
Editoval Jack06 (16. 5. 2014 11:29)
- enumag
- Člen | 2118
Je to tím že řádky v Selection jsou indexované pomocí primárního klíče tabulky ve které hledáš. Ve výsledku tvého dotazu se ale id zřejmě opakuje když pro jedno id existuje více záznamů v tabulce product_page takže dojde k tomu že se řádky nahradí.
Momochodem je tohle určitě správně
$products = $this->pageRepository->findAll()
? Nemělo by tam
být productRepository
když chceš produkty?