Více dotazů na nette DB – trochu teorie chci to pochopit

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

Tak mám zase jeden blbej teoretickej dotaz. Mám třídu definovanou jako službu a používám v ní databází:

<?php
	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}
?>

Jak jsem se dočetl (a hlavně i přesvědčil sám) tak jakmile tuto službu zavolám tak se vytvoří instance a zůstává jenom jedna. Jestliže potom tedy v dalších metodách zavolám např:

<?php
$prvnidotaz=$this->databaze->table('tabulka')->where();
?>

dostanu nějaký výsledek do proměnné $prvnidotaz. Když teď udělám:

<?php
$druhydotaz=$this->databaze->table('jinatabulka')->where();
?>

Tak jestli tomu dobře rozumím změní se mi i proměnná $prvnidotaz. To vcelku chápu. Zajímalo by mě ale, a nekamenujte mě prosím za stupidní dotaz, když udělám např.:

<?php
$pocet=$this->databaze->table('tabulka')->where()->count();
$druhydotaz=$this->databaze->table('jinatabulka')->where();
?>

Bude i po druhém dotazu proměnná $pocet obsahovat pořád počet hodnot z prvního dotazu, nebo se mi tam zase přimíchne ten druhej?
Co vrátí ten první řádek hodnotu nebo referenci ?

Chci v tom mít jasno. V podstatě to samé je když potřebuju vycucnou data z řádku přes fetch(). Vytáhnu je a naplním např. do pole se kterým dál pracuju v dalším dotazu. Můžu ? Nebo mi ten další dotaz ty data zase přepíše.

Sorry za dotaz asi na úplnej princip. To co zrovna řeším mi funguje, ale chci v tom mít jasno a chápat a né jenom slepě kopčit kód :-)

David Matějka
Moderator | 6445
+
0
-

metoda table('nazev_tabulky') v \Nette\Database\Connection VZDYCKY vytvori novou instanci \Nette\Database\Table\Selection

jediny, ceho zustava jedna instance, je Nette\Database\Connection

Editoval matej21 (8. 11. 2012 0:45)

sejmor
Člen | 63
+
0
-

Jasně ..... začíná mi to docházet

Takže ty dva dotazy se mi nepomíchaj. Narazil jsem na to nedávno ale měl jsem to asi zprasené takto:

<?php
$tabulka=$this->databaze->table('tabulka');
$pocetkusu=$tabulka->where('nejakejwhere')->count();
$dotaz=$tabulka->where('jinejwhere');
?>

Ovlivní mi ten třetí řádek proměnou $pocetkusu ?

David Matějka
Moderator | 6445
+
0
-

neovlivni, v pocet kusu zustane to cislo.. ale nezapomen, ze do $tabulka sis ulozil instanci selection a pracujes tedy nad jednou instanci selection – prvni dotaz se provede s tim nejakejwhere a druhej s nejakejwhere AND jinejwhere…

ale snaz se vyhnout znovu pouzivani stejny instance selection.. s count je to ok, ale jindy vetsinou ne :) radsi si vzdycky rekni Nette\Connection\Database o novou instanci selection (respektive by sis mel napsat nejakej model a vyhnout se primemu pristupu k Connection)

sejmor
Člen | 63
+
0
-

Díííky … mě to je právě už jasný. count() mi vráti hodnotu int takže ten druhej to neovlivní. Napsal jsem to takhle aby právě bylo vidět že se vlastně ty dva dotazy spojí. Ale pochopil jsem na co si dát pozor.

Takže účel splněn a díky moc :-)

Nox
Člen | 378
+
0
-

Neovlivní, ale POZOR: imho ten nejakejwhere bude i v druhém dotazu stále platný!