Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

CakePHP 1.3 - Coluna desconhecida na cláusula where


Você deve ter muito cuidado com o relacionamento que procura. De uma olhada rápida em algumas dessas respostas, elas parecem sugerir que você simplesmente adicione uma junção ao modelo Email em seu modelo Person e confie nas condições de sua descoberta para garantir que sua consulta não saqueie a memória do seu servidor.

Vou assumir que, em primeiro lugar, você deseja que esse relacionamento de e-mail esteja implícito em todas as suas consultas em Pessoa, caso contrário, você poderia simplesmente especificar a junção em cada consulta para a qual você queria. Nesse caso, você definitivamente deseja vinculá-lo usando relacionamentos de modelo .

Seu código mostra que Shooting e ShootingPlacement (presumo que este seja um relacionamento de mapeamento de modelo para modelo) pertencem a dois modelos. Aliás, Tiro belongsTo Emissão - que ainda não vimos aqui. Suponho que isso não seja aplicável ao cenário atual.

Agora, vamos supor que, porque sua tabela Email tem chaves estrangeiras , será um hasOne relacionamento, em vez de um hasMany - então é por isso que você precisa vinculá-lo. Vou vinculá-lo ao modelo ShootingPlacement porque este é o modelo que você está consultando, portanto, deve ser o ponto central no qual os modelos são unidos em torno dele. Em termos de estrutura, porque tudo parece se originar do seu modelo Person, sugiro que você consulte isso modelo em vez disso. Mas a forma como está configurado até agora permitirá que você consulte de praticamente qualquer lugar e ainda recupere principalmente os mesmos resultados, exceto alguns nomes de modelo e aliases de tabela.

Puramente porque sua chave estrangeira entre Email e ShootingPlacement tem um nome diferente, e o CakePHP 1.3 não lida muito bem com isso, também vou sugerir que você não use uma chave estrangeira, em vez disso, coloque-a no relacionamento como condições .
class ShootingPlacement extends AppModel
{
    var $name = 'ShootingPlacement';
    var $actsAs = array('Containable');

    var $hasOne = array(
        'Email' => array(
            'className' => 'Email',
            'foreignKey' => false,
            'conditions' => array(
                'Email.shooting_placement_id = ShootingPlacement.id',
                'Email.person_id = ShootingPlacement.person_id'
            )
        )
    );

    var $belongsTo = array (
        'Person' => array (
            'className' => 'Person',
            'foreignKey' => 'person_id',
            'order' => 'lastname ASC'
        ),
        'Shooting' => array (
            'className' => 'Shooting',
            'foreignKey' => 'shooting_id'
        )
    );
}

Eu também adicionei o comportamento contido lá. Isso permite que você controle a partir de cada consulta quais modelos associados você gostaria de retornar com os resultados do seu modelo principal. Ele será padrão para todos, mas pode ser útil quando você deseja apenas algo específico e/ou por motivos de memória (esses tipos de consultas podem destruir a memória do servidor rapidamente se você não os limitar ou especificar apenas os nomes dos campos que deseja Retorna).

Agora, quando você cria seu modelo de e-mail, eu não sugeriria complicar ainda mais essa bagunça de modelos emaranhados, vinculando-o novamente ao ShootingPlacement. Como você disse, ele também possui uma chave estrangeira para o modelo Person. Portanto, você pode querer fazer exatamente a mesma coisa acima para o seu modelo Person (alterando as condições para refletir a chave estrangeira Person, é claro). Desta forma seu modelo é um pouco mais flexível; ele ainda se juntará ao ShootingPlacement e Person, e também permitirá que você o consulte separadamente, se necessário, sem os outros modelos associados.