Grazie al suggerimento di Tox che ha + fiuto del cane di Lycos nello scovare risorse in rete, ho provato il LinkableBehavior per risolvere un problema con una query che con Containable non riuscivo a rendere efficente.
Problema
Ho il seguente schema di modelli:
Regions hasMany District hasMany City hasMany Customer.
Ho necesità di ottenere l’elenco dei clienti (Customer) che risiedono nella provincia (District) di Torino (id=1).
Soluzione con LinkableBehavior
Model:
var $actsAs = array('Linkable');
Codice:
$customers = $this->District->City->Customer->find('all',array( 'link'=>array('City'=>array('District')), 'conditions'=>array('District.id'=>$id), 'fields'=>array('Customer.id','Customer.nome','Customer.cognome','City.name')))
Risultato:
Array ( [0] => Array ( [Customer] => Array ( [id] => 1 [nome] => Giuseppe [cognome] => De Santis ) [City] => Array ( [name] => Buttigliera Alta ) ) )
Query eseguita (unica):
SELECT `Customer`.`id`, `Customer`.`nome`, `Customer`.`cognome`, `City`.`name` FROM `customers` AS `Customer` LEFT JOIN `cities` AS `City` ON (`City`.`id` = `Customer`.`city_id`) LEFT JOIN `districts` AS `District` ON (`District`.`id` = `City`.`district_id`) WHERE `District`.`id` = 1
Meglio di così….
Risorsa utile: http://planetcakephp.org/aggregator/items/891-linkable-behavior-taking-it-easy-in-your-db