Mysql
 sql >> Database >  >> RDS >> Mysql

CakePHP 1.3 - Colonna sconosciuta nella clausola where

Dovresti stare molto attento con la relazione che stai cercando. Da una rapida occhiata ad alcune di queste risposte, sembrano suggerire di aggiungere semplicemente un join al modello Email nel tuo modello Persona e fare affidamento sulle condizioni della tua ricerca per assicurarti che la tua query non rovini la memoria del tuo server.

Presumo che prima di tutto tu voglia che questa relazione e-mail sia implicita in tutte le tue domande su Persona, altrimenti potresti semplicemente specificare il join su ogni query per cui lo volevi. In questo caso, devi assolutamente collegarlo utilizzando relazioni del modello .

Il tuo codice mostra che Shooting e ShootingPlacement (supponiamo che si tratti di una relazione di mappatura da modello a modello) appartengano entrambi a due modelli. Per inciso, la ripresa di belongsTo Emissione - che non abbiamo ancora visto qui. Presumo che questo non sia applicabile allo scenario attuale.

Ora, supponiamo che la tua tabella Email ha chiavi esterne , sarà un hasOne relazione, piuttosto che un hasMany - quindi questo è ciò di cui hai bisogno per collegarlo. Lo collegherò al modello ShootingPlacement perché questo è il modello che stai interrogando, quindi dovrebbe essere il punto centrale in cui i modelli sono uniti attorno ad esso. Dal punto di vista della struttura, poiché tutto sembra provenire dal tuo modello Persona, dovrei suggerirti di interrogarlo quello modello invece. Ma il modo in cui è stato impostato finora ti consentirà di eseguire query praticamente ovunque e di recuperare ancora per lo più gli stessi risultati, barra di alcuni nomi di modelli e alias di tabelle.

Puramente perché la tua chiave esterna tra Email e ShootingPlacement ha un nome diverso e CakePHP 1.3 non lo gestisce molto bene, ti suggerirò anche di non utilizzare una chiave esterna, inserendola invece nella relazione come condizioni .

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

Ho anche aggiunto il comportamento contenibile lì. Ciò ti consente di controllare da ogni query quali modelli associati desideri restituire con i risultati del tuo modello principale. L'impostazione predefinita è tutto, ma può essere utile quando vuoi solo qualcosa di specifico e/o per motivi di memoria (questo tipo di query può distruggere la memoria del tuo server abbastanza rapidamente se non le limiti o specifichi solo i nomi dei campi che desideri ritorno).

Ora, quando crei il tuo modello di posta elettronica, non suggerirei di complicare ulteriormente questo pasticcio di modelli aggrovigliati collegandolo di nuovo a ShootingPlacement. Come hai detto, ha anche una chiave esterna per il modello Person. Quindi potresti voler fare esattamente la stessa cosa di cui sopra per il tuo modello Person (cambiando le condizioni per riflettere la chiave esterna Person ovviamente). In questo modo il tuo modello è un po' più flessibile; si unirà comunque a ShootingPlacement e Persona e ti consentirà anche di interrogarlo separatamente, se necessario, senza gli altri modelli associati.