Ublaboo\DataGrid a filtrovani joinovanych tabulek se sloupci stejneho jmena

Honza.Mottl
Člen | 104
+
0
-

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

Dle dokumentace je 3. parametr add* metod název sloupce.

Editoval CZechBoY (4. 2. 2018 11:59)

Honza.Mottl
Člen | 104
+
0
-

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

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');
?>
CZechBoY
Člen | 3608
+
0
-

Asi je potřeba to přidat do obojího, ne? tzn. jak do addColumn* tak do addFilter*

Honza.Mottl
Člen | 104
+
0
-

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');

?>