create view v nette database

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

Dobrý den, mám rád ten nápad nette-database, ale jsem pořád zastánce klasického SQL.
Podle vzoru z jednoho topicu se snažím vytvořit dotaz, kde v nově vytvořené dočasné tabulce/pohledu bude uložený SQL dotaz a tu zpracovávat klasicky.Tohle celé chci použít jako vstup do modelu Niftygridu ;
Původní návrh v topicu, který jsme uvedl a jim prý po nějaké změně funguje, vypadá takto:

- $database->table('(SELECT * FROM slozity_dotaz) AS mytable')->where('id=?', $id)->where('valid=1')
  • moje verze, kdy chci prozatim jen select z tabulky uložit jako tabulku; nebo view a ten tedy použít:
return new Dodavatel_klientGrid($this->context->database->table('CREATE TABLE mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)')->select('nabidka_dodavatele_pomocna.id, jmeno, user,polozka')->group("jmeno"));

vyhodí:Base table or view not found: 1146 Table ‚cznabidka.(SELECT * FROM nabidka_dodavatele_pomocna) AS mytable‘ doesn't exist
při sql: SHOW FULL COLUMNS
FROM `(
SELECT *
FROM nabidka_dodavatele_pomocna) AS mytable`

ani

..se->table('((SELECT * FROM nabidka_dodavatele_pomocna) AS mytable)')->s...

nebylo lepší a ani ..

...se->table("mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)")->se....

vyhodí:Base table or view not found: 1146 Table ‚cznabidka.mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)‘ doesn't exist

$this->context->database->table('(SELECT * FROM nabidka_dodavatele_pomocna) AS mytable')->select('nabidka_dodavatele_pomocna.id, jmeno, user')->group("jmeno")

a tak jsem zkoušel různé verze a nápady:

...se->table("CREATE VIEW mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)")->se...

vyhodí: Incorrect table name ‚CREATE VIEW mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)‘

...e->table('CREATE TABLE mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)')->se...

vyhodí: Incorrect table name ‚CREATE TABLE mytable AS (SELECT * FROM nabidka_dodavatele_pomocna)‘ .. to už vypadalo nadějně

Hlavní důvod proč to dělám je, že ty složitější otazy se pro mě v sql píšou mnohem rychleji.
Další důvod je, že spolužáci mi posílají sqlka.
Jestli někdo ví jak na to, kde je brouk, tak diky moc za radu – určitě jde o nějakou blbost, tak jsem to dal mezi začátečníky )

Ot@s
Backer | 476
+
0
-

czhyenacz napsal(a):

Dobrý den, mám rád ten nápad nette-database, ale jsem pořád zastánce klasického SQL.

To je dobře :-)

SQL dotazy typu INSERT/UPDATE/DELETE/CREATE/… jsou výkonné, tj. nevracejí ti na rozdíl od SELECTu žádné záznamy, resp. nejde je použít jako subdotaz a proto je potřeba použít query (kde je parametrem string s SQL):

$this->context->database->query('CREATE VIEW ...'); // i pro CREATE TABLE ...

BTW pokud nechceš použít varinatu CREATE TEMPORARY VIEW (tj. dočasný pohled) nebo nemáš jiný speciální důvod (parametrické pohledy), tak pro běžné použití (gridy) je CREATE VIEW v modelu zbytečné. Provádí se jen 1× a bývají součástí definice SQL databáze.

Rada – složitější výpisy (přes více tabulek) do gridu si nachystej pomocí „jednorázového“ CREATE VIEW … a pak do modelu gridu místo názvů tabulek sázej názvy pohledů.

czhyenacz
Člen | 12
+
0
-

dobře; to query jsem už zkoušel, ale niftygrid požaduje asi určení klíčového sloupce, tak když to udělám .

$source = new \NiftyGrid\DataSource\NDataSource($this->context->database->query('SELECT nabidka_dodavatele_pomocna.id,(...), user FROM nabidka_dodavatele_pomocna'));

boto háže:

Call to undefined method Nette\Database\Statement::getPrimary()

.. no zkusim si tedy udělat to create view někde bokem a snad to půjde, i když nevim jak ho tam pak dostat.

czhyenacz
Člen | 12
+
0
-

pro zájemce jsem to udělal takhle :

$this->context->database->query('CREATE OR REPLACE VIEW pomocne1 AS (SELECT nabidka_dodavatele_pomocna.id,(...) , user FROM nabidka_dodavatele_pomocna)');
return new Dodavatel_klientGrid($this->context->database->table('pomocne1'));

takto mi hází chybu
PDOException: No reference found for $pomocne1->. in /www/si
.. myslím, že je to způsobené nemožností přiřadit viewu klíčový sloupec
(TEMP jsem xkrát vymazal)

takže asi to zkusim s dibi )))

Editoval czhyenacz (17. 11. 2012 0:19)