Jak prepsat SQL pro nifty grid Nette\Database

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

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
+
0
-

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
+
0
-
$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
+
0
-

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)
Nifty
Člen | 45
+
0
-

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?

TheNEoo
Člen | 75
+
0
-

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
+
0
-

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
+
0
-

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)