Jak prepsat SQL pro nifty grid Nette\Database
- TheNEoo
- Člen | 75
Ahoj,
rád bych vás poprosil o pomoc s přepsáním SQL dotazu, který používam
teď na vypsání dat z sql bez gridu. na datasource pro nifty grid (nette
database). Už se tu s tím trápím dva dny a žádný výsledek.
S dalšími už si poradím, páč to bude podobné, ale ten začatek.
bez gridu.
return $this->connection->query('SELECT
ks.*,
is_setting_stav_prace.stav_prace AS stav_prace, //vlozim do stavu prace misto ID stavu prace jmeno stavu prace
is_setting_typ_prace.typ_prace // opet misto ID vlozim jmeno typu prace
FROM is_klientservis AS ks
INNER JOIN is_setting_stav_prace ON ks.stav_prace = is_setting_stav_prace.id //ks.stav_prace v sobe nese id
INNER JOIN is_setting_typ_prace ON ks.typ_prace = is_setting_typ_prace.id //ks.typ_prace v sobe nese id
WHERE is_setting_stav_prace.zobrazit_default =? AND ks.spravce =?', 1, $user
);
Vyzkoušel jsem už pár zápisů, ale nikdy se mi neudelal join ani přejmenování nic.
- Ot@s
- Backer | 476
Asi Ti někdo poradí konkrétně. Pro mě osobně to ale od této úrovně tvoby SQL pro „ORM“ končí a jdu do pohledů nebo dočasných tabulek (koneckonců, od čeho je RDBMS nabízí). Obzvláště, když pracuju s něčím jiným, než MySQL. Pokud to server výkonově zvládá a pro tebe jsou odezvy přijatelné, tak bych se toho nebál.
EDIT: vlákno pro inspiraci
Editoval Ot@s (31. 8. 2012 14:27)
- Nifty
- Člen | 45
$source = new \NiftyGrid\NDataSource(
$connection->table('is_klientservis')
->select('is_klientservis.id, is_setting_typ_prace.typ_prace')
->where('is_setting_stav_prace.zobrazit_default', 1)
->where('is_klientservis.spravce', $user)
);
Tohle by fungovalo za předpokladu, že v tabulce is_klientservis by si měl místo názvu sloupce typ_prace → is_setting_typ_prace_id a místo stav_prace → is_setting_stav_prace_id.
Pokud by si názvy sloupců nemohl změnit, tak asi jedině přes ConventionalReflection.
Editoval Nifty (31. 8. 2012 15:11)
- TheNEoo
- Člen | 75
Nifty napsal(a):
$source = new \NiftyGrid\NDataSource( $connection->table('is_klientservis') ->select('is_klientservis.id, is_setting_typ_prace.typ_prace') ->where('is_setting_stav_prace.zobrazit_default', 1) ->where('is_klientservis.spravce', $user) );
Tohle by fungovalo za předpokladu, že v tabulce is_klientservis by si měl místo názvu sloupce typ_prace → is_setting_typ_prace_id a místo stav_prace → is_setting_stav_prace_id.
Pokud by si názvy sloupců nemohl změnit, tak asi jedině přes ConventionalReflection.
Tak jo tak sem to udelal podle tebe.
nekde tam bude drobnost
vysledek:
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚is_klientservis.is_setting_stav_prace_id‘ in ‚on clause‘
Vysledek
SELECT COUNT(*)
FROM `is_klientservis`
INNER JOIN `is_setting_stav_prace` ON `is_klientservis`.`is_setting_stav_prace_id` =
`is_setting_stav_prace`.`id`
WHERE (`is_setting_stav_prace`.`zobrazit_default` = ?) AND (`is_klientservis`.`spravce` IS NULL)
- TheNEoo
- Člen | 75
Nifty napsal(a):
To je divný, takhle mi to funguje. Určitě si přejmenoval oba sloupce? Zkusil si promazat cache? Možná jsem si špatně vytvořil db podle toho dotazu, můžeš někam hodit schéma nebo sql dump?
CREATE TABLE IF NOT EXISTS `is_klientservis` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`real_name` varchar(50) NOT NULL,
`adresa` varchar(255) NOT NULL,
`telefon` varchar(15) NOT NULL,
`poznamka` longtext NOT NULL,
`is_setting_typ_prace_id` int(3) NOT NULL,
`pridal` varchar(50) NOT NULL,
` is_setting_stav_prace_id` int(3) NOT NULL,
`spravce` varchar(50) NOT NULL,
`popis_prace` longtext NOT NULL,
`datum_vlozeni` date NOT NULL,
`datum_splneni` date NOT NULL,
`datum_navstevy` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=257 ;
INSERT INTO `is_klientservis` (`id`, `real_name`, `adresa`, `telefon`, `poznamka`, `is_setting_typ_prace_id`, `pridal`, ` is_setting_stav_prace_id`, `spravce`, `popis_prace`, `datum_vlozeni`, `datum_splneni`, `datum_navstevy`) VALUES
(2, 'JMENO KLIENTA', '', '', '', 32, 'PRIDAL', 1, 'SPRAVCE', 'TEXT.', '0000-00-00', '0000-00-00', '0000-00-00 00:00:00');
CREATE TABLE IF NOT EXISTS `is_setting_stav_prace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stav_prace` varchar(50) NOT NULL,
`color` varchar(50) NOT NULL,
`zobrazit_default` tinyint(1) NOT NULL DEFAULT '0',
`prace_prirazena` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
INSERT INTO `is_setting_stav_prace` (`id`, `stav_prace`, `color`, `zobrazit_default`, `prace_prirazena`) VALUES
(1, 'Vyřešeno', '45DB27', 0, 0),
(2, 'Urgováno', 'FC0000', 1, 0),
(8, 'Nové', 'ffffff', 1, 1),
(4, 'V řešení', 'FFCB63', 1, 0),
(5, 'Zrušeno', 'CFCFCF', 0, 0),
(6, 'Odloženo', '73C2FF', 1, 0);
CREATE TABLE IF NOT EXISTS `is_setting_typ_prace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`typ_prace` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;
INSERT INTO `is_setting_typ_prace` (`id`, `typ_prace`) VALUES
(32, 'Oprava'),
(31, 'Přepojení'),
(30, 'Připojení');
is_setting_typ_prace_id → do is_klientservis ukladam jen id typu prace
is_setting_stav_prace_id → do is_klientservis ukladam jen id stavu prace
Vysledek mam takovy, ze misto id mam nazev stavu i typu prace
A jako bonus:
Jeste budu resit barvy radku v gridu, pac kdyz si vsimnes tak is_setting_stav_prace nese i color s barvou
- Nifty
- Člen | 45
Tabulka is_klientservis, sloupec ` is_setting_stav_prace_id`. Máš tam
mezeru na začátku :)
Bez mezery mi to funguje.
Ohledně barvy:
$this->addColumn('stav_prace', 'Stav práce')
->setCellRenderer(function($row){
return 'background-color:#'.$row['color'].';';
});
Samozřejmě v SQL dotazu musíš vybrat i sloupec s barvou.
Jinak věci ohledně gridu kdyžtak řeš v tématu o gridu, ať to tady nespamujeme ;)
- TheNEoo
- Člen | 75
Nifty napsal(a):
Tabulka is_klientservis, sloupec ` is_setting_stav_prace_id`. Máš tam mezeru na začátku :)
Bez mezery mi to funguje.Ohledně barvy:
$this->addColumn('stav_prace', 'Stav práce') ->setCellRenderer(function($row){ return 'background-color:#'.$row['color'].';'; });
Samozřejmě v SQL dotazu musíš vybrat i sloupec s barvou.
Jinak věci ohledně gridu kdyžtak řeš v tématu o gridu, ať to tady nespamujeme ;)
jezis tak za tu mezeru se omlouvam vubec sem ji nevidel :)
Jinajk puvodne sem toto daval do nifty fora o gridu ale spise mi tp prislo do DB
Editoval TheNEoo (31. 8. 2012 20:18)