Problema Relazione MANY_MANY e with()

Salve di nuovo,

il mio problema è che ho una relazione, ma Yii la ignora non eseguendo nessuna JOIN:

La cosa stana è che la relazione con user la interpreta correttamente ma quella con cycle viene completamente ignorata.

E’ forse la relazione many_many a creare questo problema?

Di seguito il codice del controller:




public function actionViewFacultyBoard() {

		$criteria=new CDbCriteria;

		$criteria->select='*';  // only select the 'title' column

		$criteria->with= array('user','cycles');

		$criteria->condition='cycles.id=:id';

		$criteria->params=array(':id'=>1);

		

		$dataProvider=new CActiveDataProvider('Professor');

		$dataProvider->criteria = $criteria;



E questo è il codice della relazione che sta nel model:




public function relations() {

		return array(

			'cycles' => array(self::MANY_MANY, 'Cycle', 'faculty_board(id_prof, id_cycle)'),

			'user' => array(self::BELONGS_TO, 'RegistrationForm', 'id','with'=>'profile'),

		);

	}



Di seguito il codice della query (ovviamente non funzionante (per sintetizzare ho sostituito i parametri nella select con *)):




SELECT * FROM `professor` `t` LEFT OUTER JOIN `tbl_users` `user` ON (`t`.`id`=`user`.`id`) LEFT OUTER JOIN `tbl_profiles` `profile` ON (`profile`.`user_id`=`user`.`id`) WHERE (cycles.id=:id) LIMIT 10



Grazie a chiunque possa darmi una mano.

la relazione è scritta in modo errato perché l’ordine delle chiavi per le relazioni many many prevede che la prima chiave sia del modello cui ci si sta relazionando, quindi dovrebbe diventare


'cycles' => array(self::MANY_MANY, 'Cycle', 'faculty_board(id_cycle, id_prof)'

non devi modificare l’ordine dei campi della tabella se ci stai pensando. è una regola di yii di cui ci si è anche lamentati perché la documentazione non la accenna

Ti ringrazio dell’aiuto. Ho invertito l’ordine ma non è cambiato niente nella query. :(

se anziché usare CActiveDataProvider provi a fare


Professor::model()->findAll($criteria);

la query rimane la stessa?

Provato e funziona, però per la CListView che ho nella vista ho bisogno di un DataProvider.

Hai già provato anche così?


$dataProvider = new CActiveDataProvider(Professor::model(), array( 'criteria' => $criteria));

Ritorna a non eseguire le JOIN con Cycles. :(

prova a specificare nel criteria


together => true

avessi un pò di tempo proverei a simulare la situazione…

Ma figurati. Grazie per il tempo che mi hai dedicato, ed è già tanto. Adesso funziona.

Posto qui il codice funzionante:




public function actionViewFacultyBoard() {

		$criteria=new CDbCriteria;

		$criteria->select='*'; 

		$criteria->together = true;

		$criteria->with= array('user','cycles');

		$criteria->condition='cycles.id=:id';

		$criteria->params=array(':id'=>2);


		$dataProvider = new CActiveDataProvider(Professor::model(), array( 'criteria' => $criteria));

		

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

			'dataProvider' => $dataProvider,

		));

	}