Bug v nette database selection

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

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ů:

http://2imgs.com/1e6b1c36e5

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
+
0
-

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?

Jack06
Člen | 168
+
0
-

Jojo má tam být productRepository, špatně jsem to napsal. Opravuji přímo v zadání a děkuji za odpověď, to mě nenapadlo. Přidal jsem group by id a už to vypisuje správně. Nicméně je toto i tak podle mě bug. Minimálně to mate.