Ublaboo\DataGrid a filtrovani joinovanych tabulek se sloupci stejneho jmena
- Honza.Mottl
- Člen | 104
Vytvoril jsem si v Ublaboo\DataGrid NetteDatabaseDataSource ze selectu. Je tam join dvou tabulek, ktere maji sloupce stejnych jmen (jednatelstvi_id, user_id).
Kdyz chci podle techto sloupcu filtrovat, skonci to na chybe „SQLSTATE[23000]: Integrity constraint violation: 1052 Column ‚jednatelstvi_id‘ in where clause is ambiguous in“, protoze sloupec stejneho jmena je v joinovanych tabulkach.
Bohuzel se mi tento problem nedari obejit. Kvalifikace v SELECTu pomoci „o.jednatelstvi_id AS o_jednatelstvi_id“ nepomaha, protoze Mysql bohuzel nezna AS ve WHERE klausuli.
Potreboval bych, aby v podmince ve filtru bylo „o.jednatelstvi_id = 1“ misto „jednatelstvi_id = 1“. Da se to v Ublaboo\DataGrid nejak nastavit? Nebo se to da vyresit nejak jinak?
Diky za radu
<?php
public function createComponentObjednavkaDatagrid($name) {
$jednatelstvi = array_merge(['' => ''], $this->acomplManager->getJednatelstvi());
$druhObjednavky = array_merge(['' => ''],$this->acomplManager->getDruhObjednavky());
/**
* @type DataGrid
*/
$grid = new DataGrid($this, $name);
$query =
"SELECT o.objednavka_id,
o.objednavka_uid_prefix + o.objednavka_uid_poradi AS objednavka_uid,
o.created_timestamp,
o.datum_objednavky,
o.objednavka_type,
CONCAT(IF(stornovana, ' Stornovaná', ''), IF(zlikvidovana, ' Převedená', ''),IF(vystavena, ' Vystavená', '')) AS obj_stav,
o.gener_obj_sort_jmeno,
o.pripad_id,
o.obj_je_platce,
p.gener_sort_jmeno,
o.jednatelstvi_id,
user_id
FROM pripad_objednavka o
LEFT JOIN pripad p ON o.pripad_id = p.pripad_id
LEFT JOIN user u ON o.user_id = u.user_id";
$datasource = new NetteDatabaseDataSource($this->db, $query);
$grid->setPrimaryKey('objednavka_id');
$grid->setDataSource($datasource);
$grid->setColumnsHideable();
$grid->addColumnText('objednavka_uid', 'Číslo')
->setSortable();
$grid->addColumnText('objednavka_type', 'Druh')
->setSortable();
$grid->addColumnDateTime('created_timestamp', 'Datum vytvoření')
->setSortable();
$grid->addColumnText('obj_stav', 'Stav')
->setSortable();
$grid->addColumnDateTime('datum_objednavky', 'Datum vystavení')
->setSortable();
$grid->addColumnText('gener_obj_sort_jmeno', 'Objednatel')
->setSortable();
$grid->addColumnText('obj_je_platce', 'Plátce')
->setSortable();
$grid->addColumnText('pripad_id', 'Případ')
->setSortable();
$grid->addColumnText('gener_sort_jmeno', 'Jméno')
->setSortable();
$grid->addColumnText('jednatelstvi_id', 'Jednatelství', 'jednatelstvi_id')
->setSortable();
$grid->addColumnText('user_id', 'Vlastník')
->setSortable();
/**
* Filters
*/
// problematicky filtr, sloupec je v joinovanych tabulkach
$grid->addFilterSelect('jednatelstvi_id', 'Jednatelství:', $jednatelstvi);
?>
- CZechBoY
- Člen | 3608
Dle dokumentace je 3. parametr add*
metod název
sloupce.
Editoval CZechBoY (4. 2. 2018 11:59)
- Honza.Mottl
- Člen | 104
jo, to jsem zkousel, ale to mi nepomuze. Kdyz dam „o.jednatelstvi_id AS o_jednatelstvi_id“, tak to zase neskousne Mysql, protoze ve where klausuli alias o_jednatelstvi_id nezna:
„Nette\Database\DriverException: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚o_jednatelstvi_id‘ in ‚where clause‘ in “.
Oracle by to zvladnul, ale Mysql aliasy v WHERE klausuli nezere.
<?php
public function createComponentObjednavkaDatagrid($name) {
$jednatelstvi = array_merge(['' => ''], $this->acomplManager->getJednatelstvi());
$druhObjednavky = array_merge(['' => ''],$this->acomplManager->getDruhObjednavky());
/**
* @type DataGrid
*/
$grid = new DataGrid($this, $name);
$query =
"SELECT o.objednavka_id,
o.jednatelstvi_id AS o_jednatelstvi_id,
FROM pripad_objednavka o
LEFT JOIN pripad p ON o.pripad_id = p.pripad_id";
$datasource = new NetteDatabaseDataSource($this->db, $query);
$grid->setPrimaryKey('objednavka_id');
$grid->setDataSource($datasource);
$grid->setColumnsHideable();
/*
...........
*/
$grid->addColumnText('o_jednatelstvi_id', 'Jednatelství', 'o_jednatelstvi_id')
->setSortable();
/**
* Filters
*/
// problematicky filtr, sloupec je v joinovanych tabulkach
$grid->addFilterSelect('o_jednatelstvi_id', 'Jednatelství:', $jednatelstvi);
?>
Zkousel jsem pouzit v LEFT JOINU view nebo virtualni tabulku, abych zatloukl sloupce stejneho jmena. Ale pokazde to skoncilo na ambiguous column.
- Honza.Mottl
- Člen | 104
Uz to mam. Ten treti parametr je treba pridat do addFilterSelect, to je to
spravne misto :)
V prikladu k filtru to nebylo popsano, ale kouknul jsem do zdrojaku a mam
ho :)
<?php
$grid->addFilterSelect('jednatelstvi_id', 'Jednatelství:', $jednatelstvi, 'o.jednatelstvi_id');
?>
- Honza.Mottl
- Člen | 104
Ne, to neni nutne. Alias nepotrebuji, potrebuji kvalifikovat spravne sloupec a priradit ho ve WHERE podmince k spravne tabulce. A to zaridi ten posledni parametr addFilter.
Diky, tva reakce mne navedla na prozkoumani kodu DataGridu.
<?php
public function createComponentObjednavkaDatagrid($name) {
$jednatelstvi = array_merge(['' => ''], $this->acomplManager->getJednatelstvi());
$druhObjednavky = array_merge(['' => ''],$this->acomplManager->getDruhObjednavky());
/**
* @type DataGrid
*/
$grid = new DataGrid($this, $name);
$query =
"SELECT o.objednavka_id,
o.jednatelstvi_id,
FROM pripad_objednavka o
LEFT JOIN pripad p ON o.pripad_id = p.pripad_id";
$datasource = new NetteDatabaseDataSource($this->db, $query);
$grid->setPrimaryKey('objednavka_id');
$grid->setDataSource($datasource);
$grid->setColumnsHideable();
/*
...........
*/
$grid->addColumnText('jednatelstvi_id', 'Jednatelství')
->setSortable();
/**
* Filters
*/
$grid->addFilterSelect('jednatelstvi_id', 'Jednatelství:', $jednatelstvi, 'o.jednatelstvi_id');
?>