Pergunta

Eu tenho as seguintes relações configurar:

A HABTM B
B belongsTo C
C hasMany B

Agora, para um dado A, eu preciso de toda C com o B é anexado. Eu posso escrever as consultas SQL, mas o que é o caminho CakePHP adequada? O método não vos chamo de qual modelo, e com quais parâmetros?

Foi útil?

Solução

Eu iria com resposta Aziz' e simplesmente processar os dados à medida que entra. Se você precisa de C para ser seu modelo primário, porém, você vai ter que fazer um pouco de solução alternativa. Bolo não é terrivelmente bom com condições sobre os modelos relacionados ainda, especialmente na 3ª primos removidos tipo de consultas. Ele geralmente só real Cadastre consultas sobre as relações belongsTo ou hasMany; não sobre as relações HABTM, porém, aqueles que fica em consultas separadas. Isso significa que você não pode incluir condições sobre modelos HABTM relacionados.

Sua melhor aposta, em seguida, poderia ser algo como isto:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

Note que esta produz bastante um monte de consultas, por isso não é realmente uma solução ideal. Escrever seu próprio SQL pode realmente ser a forma mais limpa.

EDIT:

Como alternativa, você poderia re-bind suas associações na mosca para torná-los relacionamentos hasMany / belongsTo, provavelmente usando a tabela de junção / modelo de a e B. isso pode permitir que você use condições sobre os modelos relacionados com mais facilidade, mas ainda é complicado para buscar Cs quando a condição é a maior.

Outras dicas

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

como este?

este trabalho poder

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

Eu acho que de comportamento "Containable" ( http://book.cakephp.org / view / 474 / Containable ) ... dá um controle muito na busca de dados relacionados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top