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:

  1. Primero, está SELECCIONANDO las ID para todos los países con el código 'US'.
  2. 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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top