CakePHP 1.3 - Unbekannte Spalte in where-Klausel

8

Ich arbeite an einem bereits existierenden CakePHP 1.3 Projekt und ich musste der Datenbank eine neue Tabelle hinzufügen. Ich habe das in meinem Controller:

%Vor%

Und es gibt mir diesen Fehler:

%Vor%

Und das ist die Abfrage, die es zu erstellen versucht:

%Vor%

Offensichtlich ist mein Controller-Code falsch, aber ich bin mir nicht sicher, wie ich die E-Mail-Tabelle mit dem ShootingPlacement in Verbindung bringen soll. Ich denke meine Modelle sind korrekt. So weit, wenn ich das habe:

%Vor%

Er ruft die Zeilen von Shooting, ShootingPlacement und Person ab. Ich möchte, dass E-Mail auch dort ist. E-Mail hat 2 Fremdschlüssel: einen von ShootinPlacement und einen von Person.

Das sind die Modelle, die einzige, die ich erstellt habe, ist Email, der Rest funktioniert richtig.

%Vor%

Was ich in der Ansicht brauche, ist die Schleife durch die ShootingPlacement-Variable, und ich brauche sie, um die E-Mail-Tabellendaten für die spezifische ID von ShootingPlacement und Person zu enthalten (wie Sie sehen, sind Person und ShootingPlacement bereits in einer Beziehung) , Ich brauche nur da um Email zu sein)

    
Elaine Marley 28.11.2013, 09:46
quelle

5 Antworten

3

Sie sollten sehr vorsichtig mit der Beziehung sein, nach der Sie suchen. Aus einem kurzen Blick auf einige dieser Antworten scheinen sie darauf hinzuweisen, dass Sie einfach einen Join zum E-Mail-Modell in Ihr Personenmodell einfügen und sich auf die Bedingungen Ihres Fundes verlassen, um sicherzustellen, dass Ihre Suchanfrage nicht den Speicher Ihres Servers durchwühlt >

Ich gehe davon aus, dass diese E-Mail-Beziehung zuallererst implizit in allen Abfragen von Person enthalten sein soll. Andernfalls könnten Sie den Join für jede gewünschte Suchanfrage angeben . In diesem Fall möchtest du es definitiv mit Modellbeziehungen .

Ihr Code zeigt, dass Shooting und ShootingPlacement (vorausgesetzt, dies ist eine Beziehung zwischen Modell und Modellzuordnung) beide zu zwei Modellen gehören. Übrigens, Shooting belongsTo Emission - was wir hier noch nicht gesehen haben. Ich nehme an, dies ist nicht auf das aktuelle Szenario anwendbar.

Nehmen wir als Nächstes an, dass Ihre E-Mail-Tabelle Fremdschlüssel enthält, dass es sich um eine hasOne -Beziehung und nicht um eine hasMany handelt - also müssen Sie sie verknüpfen durch. 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 gruppiert sind. Strukturell, weil alles von Ihrem Personenmodell zu stammen scheint, würde ich vorschlagen, stattdessen das das Modell abzufragen. Aber die Art und Weise, wie es so weit eingerichtet ist, erlaubt es Ihnen, von fast überall abzufragen und immer noch die gleichen Ergebnisse zu erhalten, um ein paar Modellnamen und Tabellenaliase zu finden.

Nur weil Ihr Fremdschlüssel zwischen E-Mail und ShootingPlacement einen anderen Namen hat und CakePHP 1.3 nicht so gut funktioniert, werde ich auch vorschlagen, dass Sie keinen Fremdschlüssel verwenden, sondern ihn in die Beziehung einfügen als Bedingungen .

%Vor%

Ich habe auch das containable-Verhalten dort hinzugefügt. Auf diese Weise können Sie von jeder Abfrage aus steuern, welche zugeordneten Modelle mit den Ergebnissen des primären Modells zurückgegeben werden sollen. Es wird standardmäßig verwendet, kann aber nützlich sein, wenn Sie nur bestimmte und / oder aus Speichergründen möchten (diese Art von Abfragen kann den Serverspeicher ziemlich schnell zerstören, wenn Sie sie nicht beschränken oder nur die gewünschten Feldnamen angeben zurück).

Wenn Sie jetzt Ihr E-Mail-Modell erstellen, würde ich nicht vorschlagen, dieses Durcheinander verschlungener Modelle weiter zu verkomplizieren, indem Sie es wieder mit ShootingPlacement verknüpfen. Wie Sie gesagt haben, hat es auch einen Fremdschlüssel für das Personenmodell. Vielleicht möchten Sie genau dasselbe wie oben für Ihr Personenmodell tun (natürlich ändern Sie die Bedingungen, um den Fremdschlüssel der Person wiederzugeben). Auf diese Weise ist Ihr Modell ein wenig flexibler; Es wird weiterhin zu ShootingPlacement und Person hinzugefügt und ermöglicht Ihnen auch, es separat abzufragen, wenn dies ohne die anderen zugeordneten Modelle erforderlich ist.

  

Dokumentation

  

Siehe auch

Robbie Averill 09.12.2013, 03:41
quelle
1

Fügen Sie in Ihrem Modell einhaltbares Verhalten hinzu

%Vor%

Schreiben Sie einfach den folgenden Code in Ihren Controller.

%Vor%

Hoffe das hilft dir.

    
Anil kumar 03.12.2013 15:33
quelle
1

Fügen Sie eine $ hasOne-Beziehung zum Personenmodell mit Email wie folgt hinzu

%Vor%

Fügen Sie dann

hinzu %Vor%

ODER Sie können einfach Joins in CakePHP verwenden, um dem E-Mail-Modell beizutreten. Siehe cakephp-Tabellen

    
user2226623 04.12.2013 09:39
quelle
1

Sie müssen Ihr Modell ShootingPlacement mit "Email" verknüpfen, mit dem Sie es aufrufen.

%Vor%

Und es ist sehr mächtig ContainableBehavior!

Beispiel:

%Vor%     
MouradK 03.12.2013 15:04
quelle
-1

Dies würde den erforderlichen Join bereitstellen:

%Vor%     
timstermatic 03.12.2013 10:45
quelle

Tags und Links