I znowu książkowy przykład

Za książką:

Tworzenie aplikacji z Yii. Receptury Autor: Alexander Makarov

Na stronie 204 mam zapis dla wyświetlenia danych z relacji (przerobione pod moje dane):


$criteria = new CDbCriteria;

      $criteria->with = array ('roleIdRole'=> array('with'=>'users'));

i na 205 dla sortowania:


 $sort= new CSort;

                $sort->attributes = array(

                    'roleIdRole'=>array(

                        'asc'=> 'rName',

                        'desc'=>'rName DESC',

                        ),

                    '*',

                    );

                return new CActiveDataProvider(get_class($this), array('criteria' => $criteria,

                    'sort'=>$sort,));

No i wyświetląć wyświetla ale nie włącza sortowania w widgetcie ;(

A jak wyświetlasz dane z relacji i jak wyglądają relacje?

Wygenerowane Giix

Model User




                public function relations() {

		return array(

			'listaAgentows' => array(self::HAS_MANY, 'ListaAgentow', 'user_id_user'),

			'clients' => array(self::HAS_MANY, 'Clients', 'user_id_user'),

			'integrators' => array(self::HAS_MANY, 'Integrators', 'user_id_user'),

			'notes' => array(self::HAS_MANY, 'Notes', 'user_id_user'),

			'agentsIdAgent' => array(self::BELONGS_TO, 'Agents', 'agents_id_agent'),

			'roleIdRole' => array(self::BELONGS_TO, 'Role', 'role_id_role'),

		);

	}


public function lista() {

		$criteria = new CDbCriteria;

                $criteria->with = array ('roleIdRole'=> array('with'=>'users'));

                $criteria->with = array ('agentsIdAgent'=> array('with'=>'users'));

                

                $sort= new CSort;

                $sort->attributes = array(

                    'roleIdRole'=>array(

                        'asc'=> 'rName',

                        'desc'=>'rName DESC',

                        ),

                    '*',

                    );

                return new CActiveDataProvider(get_class($this), array('criteria' => $criteria,

                    'sort'=>$sort,));

                    

	}

Model Role




public function relations() {

		return array(

			'users' => array(self::HAS_MANY, 'User', 'role_id_role'),

		);

	}

Kontroler




public function actionListUser()

	{

                $Lista=new User('lista');

		

		$this->render('listUser', array('Lista'=>$Lista));

	}

Widok


$this->widget('zii.widgets.grid.CGridView',array(

	'id'=>'Lista',

	'dataProvider'=>$Lista->lista(),

		'columns' => array(

							'uLogin',

							'uEmail',

                                                       array(

                                                           'name'=> 'Rola',

                                                           'value' => '$data->roleIdRole->rName',

                                                       ),

							array(

                                                            'name'=>'Agent',

                                                            'value'=>'$data->agentsIdAgent->aName.",".$data->agentsIdAgent->aCity',

                                                        ),

							array(

									'class' => 'CButtonColumn',

									'template'=>'{view}{update}{delete}',

									'buttons'=>array(

      											'view' => array(

        														'url'=>'$this->grid->controller->createUrl("/backOffice/viewUser", array("id"=>$data->id_user))',),

        										'update'=>array(

        														'url'=>'$this->grid->controller->createUrl("/backOffice/updateUser", array("id"=>$data->id_user))',),

        										'delete'=>array(

        														'url'=>'$this->grid->controller->createUrl("/backOffice/deleteUser", array("id"=>$data->id_user))',),

													),

								)

							)

													));

No i wszystko ładnie tylko nie chodzi to sortowanie dla Roli i Agenta ;D dla loginu i emaila chodzi

Nadpisałeś sobie $criteria->with




$criteria->with = array ('roleIdRole'=> array('with'=>'users'));

$criteria->with = array ('agentsIdAgent'=> array('with'=>'users'));



Nie czytałem książki, ale chyba kompletnie nie zrozumiałeś przykładu. Przy konfigurowaniu grida, atrybut "name" dla kolumny to nie treść nagłówka, tylko wewnętrzna nazwa atrybutu, który powinien się tam wyświetlać (np nazwa kolumny w bazie albo jakiś wirtualny atrybut, który sobie stworzyłeś). Chyba powinno to być "roleIdRole", ale nie wiem czy to zadziała, bo to nazwa relacji - generalnie trochę mieszasz i ciężko to ogarnąć.

Poza tym w metodzie lista() druga próba zadeklarowania $criteria->with prawdopodobnie nadpisuje pierwszą.

No tak mam w książce wklejam kod książkowy:




$criteria=new CDbCriteria;

$criteria->with=array('adress'=>array('with'=>city));...

a na następnej stronie :

Hmm tak to jest jak się po chorobie wraca do tematu :D na 99% masz racje z name:D

sprawdzam

No tak tylko teraz pytanie jak nie nadpisać skoro oba modele mają relację do modelu user i z automatu mi ustawiło w modelu agent




public function relations() {

		return array(

			'clients' => array(self::HAS_MANY, 'Clients', 'agents_id_agent'),

			'integrators' => array(self::HAS_MANY, 'Integrators', 'agents_id_agent'),

			'users' => array(self::HAS_MANY, 'User', 'agents_id_agent'),

		);

	}

i w Modelu Role:


public function relations() {

		return array(

			'users' => array(self::HAS_MANY, 'User', 'role_id_role'),

		);

	}

czyli w obu przypadkach mam users, ręcznie przerabiać wszystko czy macie pomysł na coś szybszego?

co ciekawe po zmianie name i tak sie nie zmieniło:D hmm znowu FTP coś modzi od siebie?

Po prostu pod with przypisujesz jeden raz tablicę z 2 relacjami (2-elementowa tablica).

W nazwach kolumn nie używałbym nazwy relacji, tylko ścieżki do pola, do którego chcesz się odwołać, np "users.name". Takie same pola podajesz przy konfiguracji sortowania.

Czy dobrze Cię zrozumiałem,

Nie:




$criteria->with = array ('roleIdRole'=> array('with'=>'users'));

$criteria->with = array ('agentsIdAgent'=> array('with'=>'users'));



Tylko:




$criteria->with = array (array(

                              'roleIdRole'=> array('with'=>'users'),

                              'agentsIdAgent'=> array('with'=>'users')

                         );



Chyba nie bo …

No niestety tez nadpisuje i nie pozwala sortować :(


$criteria->with = array(

                              'roleIdRole'=> array('with'=>'users'),

                              'agentsIdAgent'=> array('with'=>'users')

                         );

Tak. Albo prawdopodobnie tak:


$criteria->with = array('roleIdRole', 'agentsIdAgent');

Sortowanie może nie działać z innego powodu - już ci pisałem że używasz tam jakichś dziwnych zapisów, to daje szerokie pole do popisu jeśli chodzi o niedziałanie.

Zapisy Zmieniłem wywala błąd SQL i tylko w momencie kiedy mam dwa with kiedy ustawie tylko with dla roleIdRole wszystko hula co dziwne nie muszę stosować with żeby uzyskać to co chciałem uzyskać bez sortowania czyli nie id relacji a dane z tabeli, name poprawione (nagłówek Tabeli uzyskuje wartość nazwy Tabeli do której jest relacja) wiec ‘czuję’ że to to miejsce

W przypadku, gdy używasz relacji z tą samą tabelą kilkukrotnie, używaj aliasu, np.:




$criteria->with = array(

   'roleIdRole' => array('with' => array('users' => array('alias' => 'userRole'))),

   'agentsIdAgent' => array('with' => array('users' => array('alias' => 'userAgent'))),

);



Dzięki temu unikniesz błędów kwerendy. Aliasu używasz tak samo jak zwykłej nazwy tabeli przy odnoszeniu się do kolumn.

thx a możesz rzucić jakiś dobry link o tych aliasach?

Nie widziałem konkretnych poradników, definicja jest tutaj http://www.yiiframework.com/doc/api/1.1/CActiveRelation#alias-detail

Po forach są przykłady porozrzucane, musisz pogrzebać sam http://lmgtfy.com/?q=yii+relation+alias