realtebo
(Mirkotebaldi)
February 25, 2015, 3:52pm
1
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…
realtebo
(Mirkotebaldi)
February 25, 2015, 4:03pm
2
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 …