Mysql
 sql >> Base de données >  >> RDS >> Mysql

CakePHP 1.3 - Colonne inconnue dans la clause where

Vous devez être très prudent avec la relation que vous recherchez. D'un coup d'œil rapide à certaines de ces réponses, ils semblent vous suggérer d'ajouter simplement une jointure au modèle Email dans votre modèle Person et de vous fier aux conditions de votre recherche pour vous assurer que votre requête ne saccage pas la mémoire de votre serveur.

Je vais supposer que tout d'abord, vous voulez que cette relation Email soit implicite dans toutes vos requêtes sur Person, sinon vous pourriez simplement spécifier la jointure sur chaque requête pour laquelle vous la vouliez. Dans ce cas, vous voulez absolument le lier en utilisant modèles de relations .

Votre code montre que Shooting et ShootingPlacement (en supposant qu'il s'agit d'une relation de mappage de modèle à modèle) appartiennent tous deux à deux modèles. Incidemment, la prise de vue belongsTo Emission - que nous n'avons pas encore vu ici. Je suppose que cela ne s'applique pas au scénario actuel.

Maintenant, supposons que parce que votre table Email a des clés étrangères , ce sera un hasOne relation, plutôt qu'un hasMany - c'est donc ce dont vous avez besoin pour le lier. Je vais le lier au modèle ShootingPlacement car c'est le modèle que vous interrogez, il devrait donc être le point central auquel les modèles sont joints autour de lui. En ce qui concerne la structure, car tout semble provenir de votre modèle Person, je devrais vous suggérer de demander que modèle à la place. Mais la façon dont il est configuré jusqu'à présent vous permettra d'effectuer des requêtes depuis presque n'importe où et de récupérer la plupart du temps les mêmes résultats, à l'exception de quelques noms de modèles et alias de table.

Simplement parce que votre clé étrangère entre Email et ShootingPlacement a un nom différent, et que CakePHP 1.3 ne gère pas cela très bien, je vais également vous suggérer de ne pas utiliser de clé étrangère, mais plutôt de la mettre dans la relation en tant que conditions .

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

J'y ai également ajouté le comportement contenu. Cela vous permet de contrôler à partir de chaque requête les modèles associés que vous souhaitez renvoyer avec les résultats de votre modèle principal. Il sera par défaut à tous, mais peut être pratique lorsque vous ne voulez que quelque chose de spécifique et/ou pour des raisons de mémoire (ces types de requêtes peuvent détruire la mémoire de votre serveur assez rapidement si vous ne les limitez pas ou ne spécifiez que les noms de champs que vous voulez retour).

Maintenant, lorsque vous créez votre modèle de courrier électronique, je ne suggérerais pas de compliquer davantage ce gâchis de modèles enchevêtrés en le reliant à nouveau à ShootingPlacement. Comme vous l'avez dit, il a également une clé étrangère vers le modèle Person. Donc, vous voudrez peut-être faire exactement la même chose que ci-dessus pour votre modèle Person (modifier les conditions pour refléter la clé étrangère Person bien sûr). De cette façon, votre modèle est un peu plus flexible; il rejoindra toujours ShootingPlacement et Personne, et vous permettra également de l'interroger séparément si nécessaire sans les autres modèles associés.