In cakephp come posso fare una ricerca con condizioni su un campo correlato?

StackOverflow https://stackoverflow.com/questions/813294

  •  03-07-2019
  •  | 
  •  

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?

È stato utile?

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')
                      )
                             )
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top