Database\TableSelection: v sqlite nejde where($db->table()) a tečková notace

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

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

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

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?

hrach
Člen | 1838
+
0
-

krissott: mně přijde, že děláš chybu v návrhu databáze, dle toho, co tu čtu :D

dakota
Člen | 148
+
0
-

krissott napsal(a):

Dělám někde chybu?

Nette\Database\Selector nepodporuje takýto join:

SELECT * FROM company INNER JOIN company_parameter ON ...

ale iba

SELECT * FROM company_parameter INNER JOIN company ON ...

Editoval dakota (31. 1. 2011 18:16)

krissott
Člen | 48
+
0
-

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

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

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.