NDB a podpora view s parametrem

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

Zdravím,

prosím o radu.. mám v MySQL vytvořený pohled ‚mujpohled‘ obsahujici promenou „%year%“

A v modelu mam

$this->database->table('mujpohled');

jak spravně, pokud to lze, tam mohu poslat tu promenou?

Díky

h4kuna
Backer | 740
+
0
-

Já teda absolutně netuším na co se ptáš… Pokud máš proměnou %year% tak at reprezentuje sloupec. Tím pádem tohle funguje.

<?php
$this->database->table('mujpohled')->year;
?>
MW
Člen | 626
+
0
-

Asi mas pravdu, budu muset upravit view..
Problém je, ze tam jsou subselecty a tam prave potrebuju tu promenou…

Diky.. asi na to musim jit z druhé strany…

David Matějka
Moderator | 6445
+
0
-

ja taky nechapu. jakou promennou? ukaz, jak vypada ten view. a ukaz, jak by ses dotazoval normalnim sql.

CZechBoY
Člen | 3608
+
0
-

Proměnnou? Tak to budeš muset použít query před tím selectem, nebo proměnnou dát pryč a restrikci dělat až na celým pohledu :/

MW
Člen | 626
+
0
-

Data jsou datasource pro grid a posledne jsem to resil asi takto:

return $this->database->table('contracts')->SELECT('id, name, branches_id, since, to,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 12 AND YEAR(datzdanpln) = ' . $year . '-1 AND mrp_cislo = cislo_zak) AS lprosinec,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 1 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS leden,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 2 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS unor,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 3 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS brezen,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 4 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS duben,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 5 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS kveten,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 6 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS cerven,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 7 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS cervenec,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 8 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS srpen,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 9 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS zari,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 10 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS rijen,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 11 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS listopad,
				       (SELECT SUM(predpis) FROM mrp WHERE MONTH(datzdanpln) = 12 AND YEAR(datzdanpln) = ' . $year . ' AND mrp_cislo = cislo_zak) AS prosinec
					');

Tabulka ma vypadat :

Zakazka 	Leden		Unor		Brezen		....

Zak1		123456		123456		123456
Zak2		123456		123456		123456
Zak3		123456		123456		123456
....

Jenze se me to moc nelibi a chtěl jsem s tim pracovat lepe – jako s tabulkou.. resp. se vyhnout v NTD tomu Select().
Tak me napadlo to resit přes pohled… jenze když udelam pohled s onou promenou tak me uz doslo, ze neovlivnim výsledek.. takze asi koncim zas na tomto modelu…

CZechBoY
Člen | 3608
+
0
-

Nemůžeš použít GROUP BY MONTH, YEAR?

např

'SELECT id, name, branches_id, since, to,
	SUM(predpis)
FROM contracts
INNER JOIN mrp
	ON mrp_cislo = cislo_zak
WHERE datzdanpln > ' . $minulyProsinec . '
GROUP BY YEAR(datzdanpln), MONTH(datzdanpln)'

Editoval CZechBoY (25. 1. 2016 14:29)

MW
Člen | 626
+
0
-

Joiny se me tady libi vic, ale pak z toho nedostanu ten grid.. jako mesice ve sloupcích..

CZechBoY
Člen | 3608
+
0
-

A potřebuješ to tak? Nemůžeš použít nějakou transformační funkci v php?

MW
Člen | 626
+
0
-

Bohuzel.. nad gridem se vyhledava a filtruje..
Neva.. aspoň vim, ze tam to zverstvo není uplne k nicemu :)

Diky

CZechBoY
Člen | 3608
+
0
-

No můžeš filtrovat přece i v těch groupovanejch datech…

h4kuna
Backer | 740
+
0
-

Subselecty a view v MySql to zavání vykonostním průserem :)

Editoval h4kuna (25. 1. 2016 19:21)

h4kuna
Backer | 740
+
+2
-

Zkus si ten dotaz seskládat jinak, když to chceš mít ve sloupcích tak můžeš podmínit ten SUM. Jestli to dělá co má si odzkoušej sám, je to jen ukázka jak jinak to udělat.

Tohle bych řekl že bude dělat to samé a je to bez subselectu

<?php
$startDate = new \DateTimeImmutable(($year - 1) . '-12-01');
$period = new DatePeriod($startDate, new DateInterval('P1M'), $startDate->modify('+13 month'));

$sum = NULL;
foreach ($period as $date) {
	if ($sum !== NULL) {
		$sum .= ', ';
	}
	$sum .= "SUM(IF(DATE_FORMAT(datzdanpln, '%Y-%m') = '{$date->format('Y-m')}', predpis, 0)) AS " . $date->format('F_Y');
}

$select = $sum;
$this->database->table('contracts')->select($select)->where('mrp_cislo = cislo_zak')->group('branches_id');
?>

Hodnoty id, name, branches_id, since, to si vytáhni v samostatném dotazu ty se jen duplikují?

EDIT

Respektive teď tam dodej nějak GROUP BY podle čeho se to má agregovat. branches_id?

Editoval h4kuna (25. 1. 2016 20:15)

MW
Člen | 626
+
0
-

Moc díky, tohle vyzkouším …