Relation Belongs_To Senza Chiave Esterna

Ciao, dopo ore di ricerca non ho ancora trovato la soluzione, eppure dovrebbe sembrare una cosa easy.

Ho due tabelle

USER

id

name

role_code

ROLE

id

name

code

type

che tipo di relazione devo specificare nel model di user?

Credo che la soluzione sia vicina a questa, o almeno spero, dove dentro on andrebbe la condizione di join…




'user_role_info'=>array(self::BELONGS_TO, 'Role', '', 'on'=>'code=SE QUI METTO role_code NON FUNZIONA'),



Grazie infinite e scusate per la quantità di post giornaliera, cerco sempre documentarmi prima di chiedere. Grazie ancora!


'nome_relazione' => array(self::BELONGS_TO, 'AltroModel', 'chiave_di_questo_model_che_punta_allaltro_model')

Posso farti una domanda? Stai per caso implementando un qualche sistema che gestisca i ruoli degli utenti?

Dalla tua risposta credo di non aver spiegato benissimo.

Il valore user.role_code corrisponde a role.code, non a role.id

Si, in teoria alla fine dovrò avere 4 tipologie di utenti, 2 livelli per gli admin e 2 livelli per il cliente.

E in qualche modo dovrò differenziare anche la login, le pagine a cui accedere ecc. Ma una cosa per volta, altrimenti mi sparo :expressionless:

Nessuno? :(

Non puoi usare una belongs to su un campo che non sia primary key della tabella a cui punti, e non ha senso farlo se il campo non e’ unico nell’altra tabella, se e’ unico rendilo primary key.

Ho capito, allora come posso fare, basandomi sulla mia struttura delle tabelle, ad ottenere qualcosa come


user->user_role_info->name

non mi è possibile?

Non c’è modo nelle rules di specificare una join?


select * from user inner join role on role_code = code

I database non si usano così Giacomo.

Boh. Scusami, dato che i ruoli degli user possono essere modificati, cancellati, etc, penso sia normale non riferirsi alla Pk ma ad un code associato. Soprattutto quando vado a richiamare tutti i role dentro ad una dropdown, agli option gli passo il code, non l’id.

Correggimi se sbaglio, ma l’applicazione demo del blog non fa una cosa simile con la tabella ‘tbl_lookup’? e poi a seconda della stringa ‘type’ passata, recupera i valori.




	private static function loadItems($type)

	{

		self::$_items[$type]=array();

		$models=self::model()->findAll(array(

			'condition'=>'type=:type',

			'params'=>array(':type'=>$type),

			'order'=>'position',

		));

		foreach($models as $model)

			self::$_items[$type][$model->code]=$model->name;

	}



io faccio la stessa identica cosa, uguale uguale :)


	private static function loadRoles($type)

	{	

		self::$_roles[$type] = array();

		$models = self::model()->findAll(array(

			'condition'=>'type=:type',

			'params'=>array(':type'=>$type),

			'order'=>'code',

		));

		foreach($models as $model)

			self::$_roles[$type][$model->code]=$model->name;

	}



nel mio caso i type sono ‘internal’ e ‘client’, quindi a seconda del type passato mi restituisce tutti i code corrispettivi. Questa è la mia tabella role

id code type name

1 1 internal admin

2 2 internal operator

3 3 internal account

4 1 client admin

5 2 client operator

Come detto prima, se non stessi lavorando con Yii, utilizzeri una semplice join. Se mi dici che i db non si usano così, come potrei fare?

Grazie per la pazienza :)