Nefungujúci JOIN na základe určitého zápisu where v Nette\Database\Selector

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

Nette Framework 2.0-dev revizia d670a85 released on 2011–01–03

V prípade

$company_2_category = $db->table('company_2_category')
				->where("category_id", 14)
				->where('company.country_id', 2);

echo 'Count:' . $company_2_category->count('*').'<br>';

foreach ($company_2_category->limit(50) as $c2c) {
	echo $c2c->company->company_name.'<br>';
}

nejdojde na základe podmienky vo where k pripojeniu tabuľky company (ani pri count ani pri vypise položiek).

Chyba sa prejavuje iba ak where napíšem týmto spôsobom: ->where('company.country_id', 2).

	...
	->where('company.country_id', 2);
	// nedojde k INNER JOIN company ON ... , vyhodí to chybu

	...
	->where('company.country_id = ?', 2);
	// count aj výpis funguje v poriadku
dakota
Člen | 148
+
0
-

Chyba sa prejavuje aj v select, order …, v určitých prípadoch nedochádza k JOIN tabuľky (ošetrené identifikátory neprejdu regulárom na rozpoznanie JOIN).

Editoval dakota (18. 1. 2011 10:33)

dakota
Člen | 148
+
0
-

Nette\Database\Selector – Ak dôjde k ošetreniu identifikátorov pomocou tryDelimite tak potom nedôjde k JOIN cudzej tabuľky a vyhodí to PDOException: Column not found ....

Ošetrené identifikátory (napr. spätnými uvodzkovkami v MySQL) neprejdu regulárom na zistenie JOIN:

// TableSelection::createJoins()
preg_match_all('~\\b(\\w+)\\.(\\w+)(\\s+IS\\b|\\s*<=>)?~i', $val, $matches, PREG_SET_ORDER);

Nefungujú napr. tieto zápisy:

// identifikátory ošetrené spätnými uvodzkovkami: `company`.`country_id`, `category`.`name`
->where('company.country_id', 2);
->order('category.name');
...

zatiaľ to obchádzam zápisom, pri ktorom sa identifikátory neošetria, napr.

// identifikátory nie sú ošetrené spätnými uvodzkovkami
->where('company.country_id ', 2);
->where('company.country_id = ?', 2);
->order('category.name ');
->order('category.name ASC');

Editoval dakota (24. 2. 2011 23:47)