Domanda

Diciamo che ho 3 modelli: Utente, Regione, Paese.

User belongsTo Region
Region belongsTo Country

Ciascuno di questi modelli utilizza il comportamento Contenitore. Sto cercando di trovare utenti dal Paese con il codice "US". Ecco cosa sto tentando:

$users = $this->User->find('all', array(
    'conditions' => array('Country.code' => 'US'),
    'contain'    => array('Region.Country'),
));

CakePHP lo sta separando in 2 query:

  1. Innanzitutto, SELEZIONA gli ID per tutti i paesi con il codice "US".
  2. Quindi utilizza quegli ID per SELEZIONARE tutti gli utenti UNIRE le regioni in cui region.country_id si trova in quell'elenco di ID paese precedentemente recuperato.

Di conseguenza, finisco con errori SQL nella mia app poiché il mio array condizioni contiene un riferimento a Country.code e la seconda query che Cake crea non unisce i paesi.

La migliore soluzione Cake che vedo è quella di creare una sottoquery come descritto in Condizioni complesse di ricerca del manuale. Tuttavia, questo sembra molto contorto, ed è più un hack di quanto vorrei implementare. C'è un modo più semplice che sto trascurando?

È stato utile?

Soluzione

Nate Abele (ex capo sviluppatore di CakePHP) ha scritto un articolo su join ad hoc che potrebbe aiutare.

Altri suggerimenti

Inserisci anche le condizioni nel contenuto. Per esempio:

$users = $this->User->find('all', array('contain' => array(
    'Region' => array(
        'Country' => array(
            'conditions' => array('Country.code' => 'US'),
        ),
    ),
)));

Guarda il penultimo esempio in the Containable manuale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top