No CakePHP como posso fazer um achado com condições em um campo relacionado?
Pergunta
Eu tenho um modelo (Resultados) que tem e pertence a alguns modelos diferentes, eu gostaria de encontrar todos este modelo onde é modelo relacionado (Openhouses) tem uma condição. O 'tem e pertence à' são configurados nos arquivos de modelo. Listagens HasMany Openhouses e Openhouses pertencem listagens. (E listagens tem muitos e blongs a alguns outros modelos onde eu quero os dados.)
Eu tenho tentado.
$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'))
));
, mas sem sucesso.
Error: 1054: Unknown column 'Openhouse.date' in 'where clause
Eu sei que pode pesquisar no modelo Openhouse e obter resultados relacionados, mas, em seguida, os dados são retornados em um formato diferente e eu preciso para virar forma recursão-se para obter dados de meus outros modelos. (E eu acabar com dados Openhouse duplicados!). Eu posso postar alguns exemplos mais de código, se necessário.
A minha pergunta é, basicamente, eu preciso apenas consultar o modelo Openhouse e viver com ele ou é o meu sintaxe para colocar condições sobre os modelos relacionados incorreta?
Solução
Tente isto:
$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'))
)
)
)
Outras dicas
Se você tem um monte de modelos vinculados, configurações recursiva para 2 poderia trazer mais dados do que você pode querer.
Se isto é verdade, não é uma alternativa ao que mavarro disse, você também pode tentar usar o Containable comportamento :
$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')
)
);
Tente adicionar um
$this->Listing->recursive = 2;
antes da chamada para encontrar todos. Que deve link as tabelas antes da chamada dando-lhe acesso ao modelo Openhouse do modelo de Listagem.
$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')
)
)
)