Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CakePHP 1.3 - Unbekannte Spalte in Where-Klausel

Du solltest sehr vorsichtig mit der Beziehung sein, die du anstrebst. Nach einem kurzen Blick auf einige dieser Antworten scheinen sie vorzuschlagen, dass Sie einfach einen Join zum E-Mail-Modell in Ihr Personenmodell einfügen und sich auf die Bedingungen Ihrer Suche verlassen, um sicherzustellen, dass Ihre Abfrage nicht den Speicher Ihres Servers durchsucht.

Ich gehe davon aus, dass Sie zunächst möchten, dass diese E-Mail-Beziehung in allen Ihren Abfragen zu Person implizit enthalten ist, andernfalls könnten Sie sie einfach angeben den Join für jede Abfrage, für die Sie ihn haben wollten. In diesem Fall möchten Sie es auf jeden Fall mit Modellbeziehungen .

Ihr Code zeigt, dass Shooting und ShootingPlacement (angenommen, dies ist eine Modell-zu-Modell-Zuordnungsbeziehung) beide zu zwei Modellen gehören. Übrigens:Schießen belongsTo Emission - die wir hier noch nicht gesehen haben. Ich gehe davon aus, dass dies auf das aktuelle Szenario nicht zutrifft.

Nehmen wir nun an, dass Ihre E-Mail-Tabelle Fremdschlüssel enthält , wird es ein hasOne sein Beziehung statt hasMany - das ist also, was Sie brauchen, um es zu verlinken. Ich werde es mit dem ShootingPlacement-Modell verknüpfen, da dies das Modell ist, das Sie abfragen, also sollte es der zentrale Punkt sein, an dem Modelle darum herum verbunden werden. Da alles von Ihrem Personenmodell zu stammen scheint, müsste ich Ihnen vorschlagen, das zu hinterfragen Modell statt. Aber die Art und Weise, wie es bisher eingerichtet ist, ermöglicht es Ihnen, von fast überall aus Abfragen durchzuführen und immer noch größtenteils die gleichen Ergebnisse abzurufen, abgesehen von ein paar Modellnamen und Tabellenaliasen.

Nur weil Ihr Fremdschlüssel zwischen E-Mail und ShootingPlacement einen anderen Namen hat und CakePHP 1.3 dies nicht sehr gut handhabt, werde ich auch vorschlagen, dass Sie keinen Fremdschlüssel verwenden, sondern ihn als Bedingungen .

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

Ich habe dort auch das Containable-Verhalten hinzugefügt. Auf diese Weise können Sie von jeder Abfrage aus steuern, welche zugehörigen Modelle Sie mit Ihren primären Modellergebnissen zurückgeben möchten. Es wird standardmäßig auf alle gesetzt, kann aber praktisch sein, wenn Sie nur etwas Bestimmtes wollen und/oder aus Speichergründen (diese Art von Abfragen kann Ihren Serverspeicher ziemlich schnell zerstören, wenn Sie sie nicht einschränken oder nur die Feldnamen angeben, die Sie möchten zurück).

Wenn Sie jetzt Ihr E-Mail-Modell erstellen, würde ich nicht vorschlagen, dieses Durcheinander von verstrickten Modellen weiter zu verkomplizieren, indem Sie es erneut mit ShootingPlacement verknüpfen. Wie Sie gesagt haben, hat es auch einen Fremdschlüssel zum Person-Modell. Vielleicht möchten Sie also genau dasselbe wie oben für Ihr Person-Modell tun (wobei Sie natürlich die Bedingungen ändern, um den Person-Fremdschlüssel widerzuspiegeln). Auf diese Weise ist Ihr Modell etwas flexibler; es wird immer noch mit ShootingPlacement und verbunden Person, und ermöglicht es Ihnen auch, es bei Bedarf separat ohne die anderen zugehörigen Modelle abzufragen.