Creación de enunciados condicionales en múltiples modelos (CakePHP 1.2.5)
Pregunta
Digamos que tengo 3 modelos: Usuario, Región, País.
User belongsTo Region
Region belongsTo Country
Cada uno de estos modelos está utilizando el comportamiento Containable. Estoy intentando encontrar usuarios del país con el código 'EE. UU.'. Esto es lo que intento:
$users = $this->User->find('all', array(
'conditions' => array('Country.code' => 'US'),
'contain' => array('Region.Country'),
));
CakePHP está separando esto en 2 consultas:
- Primero, está SELECCIONANDO las ID para todos los países con el código 'US'.
- Luego está usando esas ID para SELECCIONAR a todos los usuarios que SE UNEN a las regiones donde
region.country_id
está en esa lista de ID de países recuperados previamente.
Como resultado, termino con errores de SQL en mi aplicación ya que mi matriz condiciones
contiene una referencia a Country.code, y la segunda consulta que Cake crea no se UNE a los países.
La mejor solución de Cake que veo es crear una subconsulta como se describe en Condiciones de búsqueda compleja del manual. Sin embargo, esto parece muy complicado, y es más un truco de lo que me gustaría implementar. ¿Hay alguna manera más fácil de pasar por alto?
Solución
Nate Abele (ex desarrollador principal de CakePHP) escribió un artículo sobre uniones ad hoc que podrían ayudar.
Otros consejos
Ponga las condiciones en el contenedor también. Por ejemplo:
$users = $this->User->find('all', array('contain' => array(
'Region' => array(
'Country' => array(
'conditions' => array('Country.code' => 'US'),
),
),
)));
Vea el penúltimo ejemplo en the Containable manual