[Yii 1] Named scope usando una relazone indiretta

Ho una tabella Prodotti che una un id come chiave primaria ed un campo ‘codice_prodotto’

Questo model ha la realazione 1-N con una tabella di compatiblitò




'compatibilita' 	=> array(self::HAS_MANY, "Compatibilita", "codice_prodotto"),



La tabella compatiblità ha semplicemente una serie di relazioni N-N tra codice_prodotto e id_modello

Difatti il modello delle compatiblità ha la seguente relation




'modello' => array(self::BELONGS_TO, "Modelli", 'id_modello'),



Il che chiude il cerchio creando una relazione N-N tra prodotti e modelli

Devo fare un prefiltraggio sulla tabella listini tirando dentro solo quelli con questa condizione

prodotto->compatiblita->modello->marca = "Pininfarina"

Dove marca è un campo della tabella modello.

Tenendo conto che ci sono 8 mila prodotti e 300 modelli, mi viene da pensare che il risultato, anche riuscendo a creare una realazione indiretta usando Yii, sia qualcosa tipo 10-12 mila record, per via delle relazioni n-n, che però per fortuna sono quai sempre 1-1 alla fine…

Non solo so come creare una name scope dentro a prodotti che mi crei questo tipo di filtro … , ma ho anche paura che alla fine le prestazioni ne risentano parecchio…

Ho tamponato così:

Dentro a Compatiblita ho questa relation




'modello' => array(self::BELONGS_TO, "Modelli", 'id_modello'),



E sempre dentro a Compatiblita questo named scope parametrizzato




public function byBrandName($brand_name)

{

    $this->getDbCriteria()->mergeWith(array(

    	'with'		=> array ('modello'),

        'condition' => "modello.marca = '$brand_name'",

    ));

    return $this;

}



A questo punto, dentro a Prodotti ho questa relation, come dicevo sopra




'compatibilita' 	=> array(self::HAS_MANY, "Compatibilita", "codice_prodotto"),



E, sempre dentro a Prodotti, ho creato questo named scope parametrizzato




// Parameterized Named Scopes

public function by_brand($brand_name)

{	

    $compatiblity = Compatibilita::model()->byBrandName($brand_name)->findAll();


    $compatiblity_array = CHtml::listData($compatiblity,"id", "codice_prodotto");

    $this->getDbCriteria()->addInCondition("codice_prodotto", $compatiblity_array);

    return $this;

}



Il risultato non è elegante ma è moooooolto veloce in esecuzione.

… finchè un giorno non scoppierà perchè avra 8 mila codici prodotto legati ad una singola marca … ma quel giorno ci penseremo …