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