[Risolto]Ancora Sulle Relazioni Tra Tabelle, La /view E La /index Non Vanno Piu

Apro un nuovo topic visto che non ha relazione col problema della combo.

Sono sempre con quelle due tabelle, User e Language, dove User.languageId punta a Language

questa è la relation che c’è dentro il model di User




public function relations()

	{

		return array(

		    'languageObj' => array(self::BELONGS_TO, 'Language', 'languageId'),

		);

	}






La View.php è questa (si noti ‘languageObj.name’):




<?php $this->widget('zii.widgets.CDetailView', array(

	'data'=>$model,

	'attributes'=>array(

		'id',

		'username',

		'realname',

		'email',

		'companyId',

        'languageObj.name'

		'registrationDate',

		'registrationUserId',

		'isActive',

		'isNotified',

		'defaultModulesId',

	),

)); ?>



Quando cerco di usare il l’action /View, passandogli un id, oppure anche solo il metodo /Index, ottengo questo:

CDbCommand ha riportato un errore nell’esecuzione della query SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘languageObj.’ in ‘where clause’.

The SQL statement executed was:

SELECT languageObj.id AS t1_c0, languageObj.shortCode AS t1_c1, languageObj.code AS t1_c2, languageObj.name AS t1_c3, languageObj.isDefault AS t1_c4 FROM tbl_languages languageObj WHERE (languageObj.``=:ypl0)

Questa volta cosa ho sbagliato !?

Aggiungo un dettaglio: l’errore è in

yii/framework/web/helpers/CHtml.php(1809)

dove c’è questo




1804     public static function value($model,$attribute,$defaultValue=null)

1805     {

1806         foreach(explode('.',$attribute) as $name)

1807         {

1808             if(is_object($model))

1809                 $model=$model->$name;

1810             else if(is_array($model) && isset($model[$name]))

1811                 $model=$model[$name];

1812             else

1813                 return $defaultValue;

1814         }

1815         return $model;

1816     }



La vista della index è un CListViewMWS:

Altro dettaglio, nella vista della index ho rimosso il languageId, ed ho provato a stampare ‘$data’ … qui ho notato che le relation hanno qualche problema




[relations] => Array

                (

                    [languageObj] => CBelongsToRelation Object

                        (

                            [joinType] => LEFT OUTER JOIN

                            [on] => 

                            [alias] => 

                            [with] => Array

                                (

                                )


                            [together] => 

                            [scopes] => 

                            [name] => languageObj

                            [className] => Language

                            [foreignKey] => languageId

                            [select] => *

                            [condition] => 

                            [params] => Array

                                (

                                )


                            [group] => 

                            [join] => 

                            [having] => 

                            [order] => 

                            [_e:CComponent:private] => 

                            [_m:CComponent:private] => 

                        )


                )




Visualizzando soli l’id nella index, ovviamente funziona




<td><?php echo CHtml::encode($data->languageId); ?></td>



ma così genera l’errore




<td><?php echo CHtml::encode($data->languageObj->name); ?></td>



Sei sicuro del nome languageId? Io uso sempre language_id come standard, non vorrei che ci sia qualche problema con la naming convention.

uhm… ho provato a cambiare il nome della colonna e TUTTI i riferimenti nel codice, ma il problema si presenta ancora, identico:




CDbCommand ha riportato un errore nell'esecuzione della query SQL: SQLSTATE[42S22]: 

Column not found: 1054 Unknown column 'languageObj.' in 'where clause'. 

The SQL statement executed was: 

SELECT `languageObj`.`id` AS `t1_c0`, `languageObj`.`shortCode` AS `t1_c1`, `languageObj`.`code` AS `t1_c2`, `languageObj`.`name` AS `t1_c3`, `languageObj`.`isDefault` AS `t1_c4` FROM `tbl_languages` `languageObj` 

WHERE (`languageObj`.``=:ypl0)



mi viene un dubbio: ma se nella listView della index devo usare un campo collegato devo modificare qualcosa qui ?




	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('User', 

		        array(

                    'criteria' => array(

                                    'select' => 'id, username, realname, email, companyId, language_id, registrationDate, registrationUserId, isActive, isNotified, defaultModulesId',

                                    'order' => 'username ASC',

                                    )

		             )

	    );

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

		));

	}




non è che devo esplicitare che mi serve languageObj.name ? , ho provato a metterlo nella select, ma da un’altro errore

che stres… sto notando solo ora che nell’errore SQL c’è sta cosa:


FROM `cprol_languages` `languageObj`

… va a finire che mi tocca debuggare il php di yii. …

No, dovrebbe funzionare.

Prova a impostare le foreign key nel database a far generare le relations da gii.

non posso. sono su mysql con engine myisam … come nel 1979 … ma questa scelta non dipende da me …

provato con relazione HAS_ONE ?

e poi commenta la Detailview e a stampa i valori per restringere il campo.

print_r($model->languageObj)

e poi

print_r($model->languageObj->nomecolonna .

Altra prova… prova ad eliminare le maiuscole… ad esempio nella relazione, su linux ci potrebbero essere

‘incomprensioni’ legate al case sensitive

assurdo, ci sono arrivato seguendo passo passo il codice php di Yii

stamattina abbiamo avuto bisogno di ‘copiare’ alcune tabelle , tra cui la user e la language, e poi abbiamo proseguito lavorando sulle copie … ebbene … erano sparite le chiavi primarie … colpa di un essere umano tonto o di phpmyadmin, ma non colpa ne mia ne di Yii…

Chiudo, scusate per il disturbo, sigh . . .