create view v nette database
- czhyenacz
- Člen | 12
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
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
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
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)