klasický zápis SQL dotazů

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

Zdravím,
v https://forum.nette.org/…imo-sql-kodu se píše, že lze přímo použít klasický SQL dotaz. Nepochopil jsem však, jak to lze využít – jako by se to mělo psát do modelu, já bych však měl představu, že model pouze „připojuje“ tabulku a vlastní dotazy jsou v presenteru. Není někde nějaký příklad?

Jan Mikeš
Člen | 771
+
0
-

Vlastni dotazy muzes mit jak v presenteru, tak v modelu. Ale mit dotazy v presenteru je proti spravnemu navrhovemu MVC vzoru, ktery se snazi oddelit datovou vrstvu od logicke.

Pokud ale chces v presenteru sve vlastni dotazy docilis toho napr takto:

class NecoPresenter extends BasePresenter{

	private $database;

	public function startup(){
		parent::startup();
		$this->database = $this->context->database;
	}

	public function renderDefault(){
		$this->template->myTable = $this->database->query("SELECT * FROM table");
	}
}
Jan Endel
Člen | 1016
+
0
-

Fuj fuj a ještě 40× fuj, query do presenteru skutečně krutě nepatří. Jediná vyjímka jsou micropresentery.

jik
Člen | 146
+
0
-

Tak potom tedy tomu nerozumím. Vezmu quickstart:
Zde jsou modely jakési konstruktory (OOP v podstatě neznám), tedy mám za to, že zde vytvářím „připojení k tabulkám“, například:

<?php
class Tasklists extends Selection {
	public function __construct(Connection $connection) {
		parent::__construct('tasklist', $connection);
	}
}
?>

Žádné SQL dotazy zde nevidím. Takto jsem to dosud chápal. Potom v presenteru vidím takové ty pro mě „zvrhlé“ zápisy typu:

<?php
public function createComponentIncompleteTasks() {
	$tasks = $this->context->createTasks()->where(array('done' => false))->order('created ASC');
	return new TaskList($tasks, $this->context->createTasks());
}
?>

ve kterých až dosud vidím vlastní dotazy do db.
Pokud to nejsou dotazy, znamená to pouze jakési ‚sekundární filtrování‘ dat mimo SQL server? Ovšem v tom případě mám problém – moje databáze bude veliká a pokud by filtrování neprováděl SQL server, budu celou mašinu enormně zatěžovat díky (zbytečnému) přenosu obrovského množství dat. Zřejmě tedy zapracovat na modelech … Ale zase to OOP – jsou nějaké ukázky takovéhoto přístupu k databázi?

Jan Mikeš
Člen | 771
+
0
-

pilec napsal(a):

Fuj fuj a ještě 40× fuj, query do presenteru skutečně krutě nepatří. Jediná vyjímka jsou micropresentery.

Ja to zminil ze to neni spravne :))

Jiknapsal(a):

Toto jsou komponenty a ne modely. A metody ->where a ->order nejsou v presenteru tak spatne, obcas sve vyuziti najdou i az v sablone. Pracuji na urovni SQL serveru, vyzkousej si takovy dotaz na localhostu a koukni se jake SQL ti vygeneruje. Jestli mas takovou predstavu, ze nejdrive se prenesou vsechna data, a potom se filtruji az v PHP tak to je spatne. Nette database je pokud vim, navrzena tak chytre, aby prenasela co nejmensi mnozstvi dat.

Ono MVC a vsechno moderni programovani je JENOM o OOP, takze pokud s nim nejsi moc kamarad, doporucuji si nejdrive precist nejake navody ciste o OOP a potom se az vrhnout na nejaky framework.

S cim tedy vlastne potrebujes poradit?

Jan Endel
Člen | 1016
+
0
-

Vseobecně současný QS ze kterého ukázka pochází je mírně nešikovný, už pracuju na vylepšené verzi.

jik
Člen | 146
+
0
-

No pánbůh zaplať, že to nevolá natvrdo „SELECT * FROM tabulka“, ale to zase znamená, že vlastně presenter sestavuje dotaz. Mám v tom tedy guláš. Rád bych jedno jediné – do:

<?php
public function createComponentIncompleteTasks() {
        $tasks = $this->context->createTasks()->where(array('done' => false))->order('created ASC');
        return new TaskList($tasks, $this->context->createTasks());
}
?>

chci psát víceméně klasické SQL dotazy, tedy:

'... where done=false order by created'

Tady to je samozřejmě nezajímavé, ale čeká mě aplikace s poměrně složitou a rozsáhlou databází a komplikovanými dotazy napříč tabulkami a to si nejsem vůbec jist, jak na to (podotýkám, že jsem začal zkoušet Symfony2 a skončil na Doctrine, které některé věci prostě nebylo schopno zvládnout – možná to chtělo ještě chvíli pokračovat, ale to se objevil ještě další problém – rychlost). Ony všechny ty mezivrstvy přinášejí zpomalení a také omezení. Proto zkouším Nette, ale rád bych pracoval na úrovni klasických SQL dotazů, protože vůbec nevím, jak podobné dotazy konstruovat pro tyto abstrakce. Mám samozřejmě své vlastní staré PHP knihovny, ale rád bych migroval na něco modernějšího, kde je vyřešena řada dalších věcí.

Jan Mikeš
Člen | 771
+
0
-

Jak jsem psal v 2. prispevku, trida Nette\Database\Connection (https://api.nette.org/…nection.html) ma metodu query, ktera vyresi tvuj problem. At uz to budes delat v presenteru, v modelu kam si nastrcis pripojeni pres konstruktor, vsude se pouziva metoda query stejne:

$query = $database->query("SELECT * FROM table");

Jinak tady je takova mala napoveda ktera by ti mohla mozna pomoci: http://sql-cross-queries.freexit.eu/sql/nettedb

jik
Člen | 146
+
0
-

Jsem z toho nějak nadivoko, ideologii nemám rád. Na jednu stranu názor, že do presenteru dotazy nepatří, na druhou stranu tam, alespoň mám dojem, fakticky jsou. Pod pojmem modely vidím db tabulky, za takové situace nemám s modely problém. Potom ovšem dotaz do db realizuje presenter – ať už tomu říkám query, nebo komponenty – což si myslím, že tomu tak je. Pokud bych dotazy strčil do modelu, potom fakticky pro každý dotaz potřebuji nový model? – zase asi by to zvládlo složité situace – ovšem bylo by to neudržovatelné, tedy proti principům MVC. To se mi jeví jako pitomost. Tedy potom logicky dotazy patří do presenteru – v čem tedy vlastně je problém?

Tomas Jancik
Člen | 103
+
0
-

Nechci te nijak urazit, ale myslim ze by sis mel nejdrive nastudovat trochu terminologii… zda se mi, ze tu michas jabka s hruskama
viz treba

jik wrote:

Potom ovšem dotaz do db realizuje presenter – ať už tomu říkám query, nebo komponenty

jinak SQL dotazy do presenteru nepatri… patri do modelu a nevidim duvod proc bys v jednom modelu nemohl mit dotazu vice.....

22
Člen | 1478
+
0
-

jik napsal(a):

Jsem z toho nějak nadivoko, ideologii nemám rád. Na jednu stranu názor, že do presenteru dotazy nepatří, na druhou stranu tam, alespoň mám dojem, fakticky jsou.

To není ideologie, to je praxe a základní princip. Ale jestli chceš, tak si to strkej do presenteru a tvrď nám, že model rovná se tabulka, až to po tobě někdo bude za půl roku opravovat a hledat SQL dotazy po Presenterech, tak se nediv, že ti bude chtít utrhnout hlavu :-) Možná si ji budeš chtít utrhnout i sám.

jik
Člen | 146
+
0
-

Neurážíš mě, já pochopil, že do presenteru dotazy nepatří, ale zatím se nemám čeho chytit – v modelu quickstartu po nějakých dotazech není ani památky a nějakou další rozumně jednoduchou demostraci, z které bych vyčuchal, jak to chodí, jsem nenašel. Je to pro Nette 0.9, nebo pro Dibi a zatím nemám chuť se v tom prohrabovat, když mi vlastně jenom přibude nejasností.

Tomas Jancik
Člen | 103
+
0
-

jik wrote:

zatím nemám chuť se v tom prohrabovat, když mi vlastně jenom přibude nejasností.

kdyz se v tom zacnes hrabat, tak to brzo pochopis a ty nejasnosti se vysvetli a slijou do funkcniho celku