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
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
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)