Database\TableSelection: v sqlite nejde where($db->table()) a tečková notace
- bojovyletoun
- Člen | 667
nette 2011–1–13 NS. df32739 , PHP5.3.5
Ahoj, mám problém – obojí v Tableselection.php při použití sqlite3
1)
select s tečkovou notací nedžojnuje( a vyhodí no such column)- příklad
$db->table("clovek")->where('clovek_typ.id',2)->fetch(...)
"SELECT * FROM [clovek] WHERE ([clovek_typ].[id] = ?)"
příčina:
->execute->getSql->createJoins(implode(',', $this->select)
Metody ( v příkladu where, ale i jiné jako select)volají
tryDelimite a změní select z clovek_typ.id
na
[clovek_typ].[id]
. To pak neprojde regexpem
v createjoins.
Po úpravě, kdy tryDelimite nezmění nic (pokusně) to funguje jak má:
SELECT [clovek].* FROM [clovek]
INNER JOIN [clovek_typ] ON [clovek].[clovek_typ_id] = [clovek_typ].[id]
WHERE (clovek_typ.id = ?)
2)
nefunguje TableSelection v where, volá TableSelection::__toString, což
neproje. řádek 204
$db->table('pepa')->where('franta',$db->table('jáchym'))->fetch(...)
} elseif ($parameters instanceof TableSelection) { // where('column', $db->$table())
$clone = clone $parameters;
...
if ( $this->connection->getAttribute(\PDO::ATTR_DRIVER_NAME) !== 'mysql') {
$condition .= " IN ($clone)";
}else{korektní sestavení IN(1,2,3,4...) pomocí foreach}
proč se testuje mysql?
a co tam dělá „IN($clone)“- to nemůže fungovat?
Pokud přeskočím if(!==mysql), tak to opět funguje v pořádku.
Editoval bojovyletoun (17. 1. 2011 1:21)
- dakota
- Člen | 148
Podobnú chybu s where a JOIN som uvádzal na:
https://forum.nette.org/…ase-selector
Napríklad:
->where('company.country_id', 2) // vyhodí chybu
->where('company.country_id ', 2); // dôjde k JOIN
->where('company.country_id = 2'); // dôjde k JOIN
MySQL sa testuje kvôli poddotazom, poddotazy nie sú v MySQL efektívne, preto sa pri MySQL prevádzajú na IN ($ids) namiesto IN (poddotaz).
Editoval dakota (17. 1. 2011 9:47)
- krissott
- Člen | 48
Taky zkouším join za pomocí WHERE, ale příjde mi, že to ten join generuje naopak.
<?php
SELECT `clovek`.* FROM `clovek` INNER JOIN `clovek_typ` ON `clovek`.`clovek_typ_id` = `clovek_typ`.`id` WHERE (clovek_typ.id = ?)
nemelo by to byt takto?
SELECT `clovek`.* FROM `clovek` INNER JOIN `clovek_typ` ON `clovek`.`id` = `clovek_typ`.`clovek_id` WHERE (clovek_typ.id = ?)
?>
Ukážu na mém případu:
mám 3 tabulky – klasické M:N
company(id,name)
parameter(id,name)
company_parameter(company_id,parameter_id)
Ted bych potřeboval vypsat společnosti, které splňují určité parametry.
<?php
self::getConnection()->table('company')->where('company_parameter.parameter_id ', 2) // bez mezery opravdu nejede vubec
//Vygeneruje mi
SELECT `company`.* FROM `company` INNER JOIN `company_parameter` ON `company`.`company_parameter_id` = `company_parameter`.`id` WHERE (company_parameter.parameter_id = ?)
//Melo by byt
SELECT `company`.* FROM `company` INNER JOIN `company_parameter` ON `company`.`id` = `company_parameter`.`company_id` WHERE (company_parameter.parameter_id = ?)
?>
Dělám někde chybu?
- krissott
- Člen | 48
hrach napsal(a):
krissott: mně přijde, že děláš chybu v návrhu databáze, dle toho, co tu čtu :D
Spíše jsem si neuvědomil, že bojovyletoun neuvádí M:N relaci.
Dakota: Takže musím začínat u spojovací tabulky? V tomto případě u company_parameter?
Editoval krissott (31. 1. 2011 18:24)
- dakota
- Člen | 148
Môžeš použiť:
$companies = $db->table('company')
->where('id', $db->table('company_parameter')->where('parameter_id', 2)->select('company_id'));
foreach($companies as $company) {
echo $company->name;
}
alebo
$company_parameter = $db->table('company_parameter')->where('parameter_id', 2);
foreach($company_parameter as $cp) {
echo $cp->company->name;
}
Editoval dakota (31. 1. 2011 18:28)
- krissott
- Člen | 48
dakota napsal(a):
Môžeš použiť:
$companies = $db->table('company') ->where('id', $db->table('company_parameter')->where('parameter_id', 2)->select('company_id')); foreach($companies as $company) { echo $company->name; }
alebo
$company_parameter = $db->table('company_parameter')->where('parameter_id', 2); foreach($company_parameter as $cp) { echo $cp->company->name; }
Jasně. Takže ten JOIN asi není vubec dělaný pro M:N relaci co :) .
Díky moc.