sql >> Base de Datos >  >> RDS >> Mysql

CakePHP 1.3 - Columna desconocida en la cláusula where

Debes tener mucho cuidado con la relación que buscas. De un vistazo rápido a algunas de estas respuestas, parecen sugerir que simplemente agregue una unión al modelo de correo electrónico en su modelo de persona y confíe en las condiciones de su búsqueda para asegurarse de que su consulta no saquee la memoria de su servidor.

Asumiré que, en primer lugar, desea que esta relación de correo electrónico esté implícita en todas sus consultas sobre Persona; de lo contrario, simplemente podría especificar la unión en cada consulta para la que lo quería. En este caso, definitivamente querrá vincularlo usando relaciones modelo .

Su código muestra que Shooting y ShootingPlacement (supongamos que esta es una relación de mapeo de modelo a modelo) pertenecen a dos modelos. Por cierto, disparar belongsTo Emisión - que no hemos visto aquí todavía. Supongo que esto no es aplicable al escenario actual.

Ahora, asumamos lo malo que debido a que su tabla de correo electrónico tiene claves externas , será un hasOne relación, en lugar de una hasMany - entonces eso es lo que necesitas para vincularlo. Voy a vincularlo al modelo ShootingPlacement porque este es el modelo que está consultando, por lo que debería ser el punto central en el que los modelos se unen a su alrededor. En cuanto a la estructura, debido a que todo parece originarse en su modelo de Persona, tendría que sugerirle que consulte eso modelo en su lugar. Pero la forma en que está configurada hasta ahora le permitirá realizar consultas desde casi cualquier lugar y aun así recuperar la mayoría de los mismos resultados, salvo algunos nombres de modelos y alias de tablas.

Simplemente porque su clave externa entre Email y ShootingPlacement tiene un nombre diferente, y CakePHP 1.3 no maneja esto muy bien, también voy a sugerir que no use una clave externa, sino que la coloque en la relación como condiciones .

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'
        )
    );
}

También he agregado el comportamiento contenedor allí. Esto le permite controlar desde cada consulta qué modelos asociados le gustaría devolver con los resultados de su modelo principal. Por defecto será todo, pero puede ser útil cuando solo desea algo específico y/o por razones de memoria (este tipo de consultas pueden destruir la memoria de su servidor con bastante rapidez si no las limita o especifica solo los nombres de campo que desea). volver).

Ahora, cuando cree su modelo de correo electrónico, no sugeriría complicar más este lío de modelos enredados vinculándolo nuevamente a ShootingPlacement nuevamente. Como ha dicho, también tiene una clave externa para el modelo Person. Por lo tanto, es posible que desee hacer exactamente lo mismo que se indicó anteriormente para su modelo de Persona (cambiando las condiciones para reflejar la clave externa de Persona, por supuesto). De esta forma tu modelo es un poco más flexible; aún se unirá a ShootingPlacement y Persona, y también le permitirá consultarlo por separado si lo requiere sin el resto de modelos asociados.