In cakephp come posso fare una ricerca con condizioni su un campo correlato?
Domanda
Ho un modello (Schede) che ha e appartiene a pochi modelli diversi, mi piacerebbe trovare tutto questo modello in cui il suo modello correlato (Openhouses) ha una condizione. 'Has e appartiene a' sono impostati nei file del modello. Gli elenchi hanno molti Openhouse e Openhouses appartenenti a Listings. (E gli elenchi hanno molti altri errori in alcuni altri modelli in cui voglio i dati.)
Ci ho provato.
$this->Listing->find('all',
array('conditions' =>
array('Openhouse.date >' => $openhouse_start->format('Y-m-d H:i:s'),
'Openhouse.date <' => $openhouse_end->format('Y-m-d H:i:s'))
));
ma inutilmente.
Error: 1054: Unknown column 'Openhouse.date' in 'where clause
So di poter cercare sul modello Openhouse e ottenere elenchi correlati, ma poi i dati vengono restituiti in un formato diverso e ho bisogno di aumentare la ricorsione per ottenere i dati dagli altri miei modelli. (E finisco con i dati duplicati dell'openhouse!). Posso pubblicare altri esempi di codice, se necessario.
La mia domanda è fondamentalmente: devo solo interrogare il modello openhouse e conviverci o la mia sintassi per mettere le condizioni sui modelli correlati non è corretta?
Soluzione
Prova questo:
$this->List->find('all', array(
'contain' => array(
'Openhouse.conditions' => array(
'Openhouse.date >' => $openhouse_start->format('Y-m-d H:i:s'),
'Openhouse.date <' => $openhouse_end->format('Y-m-d H:i:s'))
)
)
)
Altri suggerimenti
Se hai molti modelli collegati, le impostazioni ricorsive a 2 potrebbero portare più dati di quanto potresti desiderare.
Se questo è vero, c'è un'alternativa a quanto detto da mavarro, puoi anche provare a usare Comportamento contenitore :
$this->Listing->find
(
'all',
array
(
'conditions' => array
(
'Openhouse.date >' => $openhouse_start->format('Y-m-d H:i:s'),
'Openhouse.date <' => $openhouse_end->format('Y-m-d H:i:s')
),
'contain' => array('Openhouse')
)
);
Prova ad aggiungere a
$ this- > Listing- > recursive = 2;
prima della chiamata per trovare tutto. Quel dovrebbe collegare le tabelle prima della chiamata dandoti l'accesso al modello Openhouse dal modello di elenco.
$this->List->find('all', array(
'contain' => array(
'conditions' => array(
'Openhouse.date >' => $openhouse_start->format('Y-m-d H:i:s'),
'Openhouse.date <' => $openhouse_end->format('Y-m-d H:i:s')
),
'order' => array('Openhouse.date DESC')
)
)
)