sortowanie w gridView

Witam

Problem taki jest:

tworze trzy tabele w relacjach jak poniżej


CREATE  TABLE IF NOT EXISTS `tbl_promocja` (

  `id_promocja` INT NOT NULL AUTO_INCREMENT ,

  `id_produkty` INT NOT NULL ,

  `stara_cena` DECIMAL(5,2) NULL ,

  `nowa_cena` DECIMAL(5,2) NULL ,

  `nowosc` TINYINT(1) NULL ,

  `aktywna` TINYINT(1) NULL ,

  PRIMARY KEY (`id_promocja`) ,

  INDEX `fk_tbl_promocja_tbl_produkty1` (`id_produkty` ASC) ,

  CONSTRAINT `fk_tbl_promocja_tbl_produkty1`

    FOREIGN KEY (`id_produkty` )

    REFERENCES `tbl_produkty` (`id_produkty` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB







CREATE  TABLE IF NOT EXISTS `tbl_produkty` (

  `id_produkty` INT NOT NULL AUTO_INCREMENT ,

  `id_dzial` INT NOT NULL ,

  `nazwa` VARCHAR(45) NULL ,

  `ref` VARCHAR(45) NULL ,

  `opis` TEXT NULL ,

  PRIMARY KEY (`id_produkty`) ,

  INDEX `fk_tbl_produkty_tbl_dzial1` (`id_dzial` ASC) ,

  CONSTRAINT `fk_tbl_produkty_tbl_dzial1`

    FOREIGN KEY (`id_dzial` )

    REFERENCES `tbl_dzial` (`id_dzial` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = InnoDB




CREATE  TABLE IF NOT EXISTS `tbl_dzial` (

  `id_dzial` INT NOT NULL AUTO_INCREMENT ,

  `nazwa` VARCHAR(45) NULL ,

  `opis` TEXT NULL ,

  PRIMARY KEY (`id_dzial`) )

ENGINE = InnoDB



jak i czy wogole moge w gridView zrobic sortowanie wynikow promocji ale po nazwie działu produktu tej promocji. troche to zagmatwane ale postaram sie to jakos opisac:

search modelu PromocjaSearch wyglada tak:




public function search($params) {

        $query = Promocja::find();


//lacze tabele produkty

        $query->joinWith('produkty');


        

        $dataProvider = new ActiveDataProvider([

            'query' => $query,

        ]);


// teraz moge sortowac wyniki po nazwie produktu


        $dataProvider->sort->attributes['produkty'] = [

            'asc' => ['tbl_produkty.nazwa' => SORT_ASC],

            'desc' => ['tbl_produkty.nazwa' => SORT_DESC],

        ];


// chcialem sie dostac do nazwy dzialu produktu w promocji

//niestety moge sortowac tylko po id_dzialu to dziala


        $dataProvider->sort->attributes['dzial'] = [

            'asc' => ['tbl_produkty.id_dzial' => SORT_ASC],

            'desc' => ['tbl_produkty.id_dzial' => SORT_DESC],

        ];


//to juz nie dziala

//        $dataProvider->sort->attributes['dzial'] = [

//            'asc' => ['tbl_produkty.id_dzial.nazwa' => SORT_ASC],

//            'desc' => ['tbl_produkty.id_dzial.nazwa' => SORT_DESC],

//        ];


        $this->load($params);


        if (!$this->validate()) {

            // uncomment the following line if you do not want to return any records when validation fails

            // $query->where('0=1');

            return $dataProvider;

        }


        $query->andFilterWhere([

            'id_promocja' => $this->id_promocja,

            'id_produkty' => $this->id_produkty,

            'stara_cena' => $this->stara_cena,

            'nowa_cena' => $this->nowa_cena,

            'nowosc' => $this->nowosc,

            'aktywna' => $this->aktywna,

            

        ]);


        $query->andFilterWhere(['like', 'tbl_produkty.nazwa', $this->produkty]);




        return $dataProvider;

    }




Spróbuj:




        $query->joinWith(['produkty', 'produkty.dzial']);


        /.../


        $dataProvider->sort->attributes['dzial'] = [

            'asc' => ['tbl_dzial.nazwa' => SORT_ASC],

            'desc' => ['tbl_dzial.nazwa' => SORT_DESC],

        ];






nie dziala poniewaz nie ma powiazania relacyjnego z tabela tbl_dzial

Nie masz zdefiniowanej relacji produkt-dzial?

mam zdefiniowana relacje produkt-dzial i promocja-produkt

wywala blad




Unknown column 'tbl_dzial.nazwa' in 'order clause'

The SQL being executed was: SELECT `tbl_promocja`.* FROM `tbl_promocja` LEFT JOIN `tbl_produkty` ON `tbl_promocja`.`id_produkty` = `tbl_produkty`.`id_produkty` ORDER BY `tbl_dzial`.`nazwa` LIMIT 20



tabela tbl_dzial zawiera tylko id_dzial

ok działa trzeba zrobic osobne dołączenie

$query->joinWith(‘produkty.dzial’);

i zmienic nazwe atrybutu GridView na produkty.dzial

teraz jeszcze filtrowanie odezwe sie jak bede mial problemy :)

Dzieki