[Yii 1] [Risolto] Cross-db relation: come?

Ho, purtroppo, la necessità di fare una query cross-db.

Il mio model Ordini ha questa relazione




'cliente' 		=> array (self::BELONGS_TO, "Cliente", 'id_cliente'),



Funziona benissimo nella admin view, dove c’è la solita CGridView impostata così


array (

			'name'		=> 'customer_search',

			'value'		=> '(isset($data->cliente) 

							? $data->cliente->nome

							: "")',

		),



In questo caso, dato che desidero poter effettuare anche il filtro per nome cliente ho fatto così: ho creato dentro al model Ordini la variabile pubblica ‘customer_search’ (la classica via di fuga per le ricerche in tabelle correlate)




public $customer_search;

...



e nelle rules




array('customer_search', 'safe', 'on' => 'search'),



Questo è il codice del search()




                if ($this->customer_search) {

			$criteria->with[] = "cliente";

			$criteria->compare('cliente.nome', $this->customer_search, true);

		}



Quando però cerco di filtrare la colonna (digitando del testo nella casella del filtro nella view admin) ottengo questo errore

ed è vero perchè cliente sta in, diciamo, ‘db_del_cliente.tbl_cliente’.

Il lazy loading effettuato in fase di rendering della cgridview funziona perchè viene effettuata una query non cross_db, ma coma faccio per far funzionare la ricerca?

Immagino di poter / dover indicare il nome del db da qualche parte, ma dove?

Posto una soluzione, per i posteri, per ora sembra funzionare

Questo codice fa parte del model Cliente




        public function getDbConnection()

	{

		return Yii::app()->db;

	}


	private function getDbConnectionName()

	{

		return "app";

	}


	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return $this->getDbConnectionName() . "." .

				$this->dbConnection->tablePrefix .'cliente';

	}




Una piccola nota: ho usato la chiamata di funzione ( "->getDbConnectionName()" ) invece del magic getter ( "->dbConnectionName" ) perchè i getter magici devono essere pubblici.

Questo è causato da questa riga di codice [link aggiornato alla 1.1.16]