PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

fehlender FROM-Klauseleintrag für Tabelle Grupo cakephp

Sie benötigen die grupos-Tabelle, die in die Abfrage eingebunden werden soll, Ihre Abfrage in der Frage hat keine Verknüpfungen. Es gibt eine Reihe einfacher Lösungen.

Definiere rekursiv.

Rekursiv ist eine sehr grobe Kontrolle darüber, welche Verknüpfungen und Abfragen ausgeführt werden, standardmäßig find('list') hat einen rekursiven Wert von -1.

-1 bedeutet keine Verknüpfungen, weshalb die resultierende Abfrage keine Verknüpfung enthält. Wenn Sie ihn auf den Wert 0 setzen, wird der Hauptabfrage ein Join für alle hasOne- und gehörtzu-Verknüpfungen hinzugefügt.

Seien Sie vorsichtig, wenn Sie rekursiv verwenden/verlassen, da es sehr einfach ist, Abfragen mit Verknüpfungen zu generieren, die Sie nicht benötigen – und/oder viele nachfolgende Abfragen für verwandte Daten auslösen (wenn auf einen Wert größer als 0 gesetzt).

Allerdings findet dieser Aufruf:

$data = $this->Soya->find('list', array(
    'fields'=> array('Soya.id','Soya.username'),
    'recursive' => 0, // added
    'conditions' => array(
        'Grupo.categoria' => 'Soya' , 
        'Grupo.subcategoria' => 'Productor de Oleaginosas'
    )
));

Sollte zu dieser Abfrage führen (If das Soya-Modell hat eine Zugehörigkeit zu Grupo):

SELECT
    "Soya"."id" AS "Soya__id",
    "Soya"."username" AS "Soya__username"
FROM
    "public"."users" as "Soya"
LEFT JOIN
    "public"."Grupos" as "Grupo" on ("Soya"."grupo_id" = "Grupo"."id")
...
Possibly more joins
...
WHERE
   "Grupo"."categoria" = 'Soya' 
    AND 
    "Grupo"."subcategoria" = 'Productor de Oleaginosas'

Oder Containable verwenden

Das Containable-Verhalten ermöglicht eine bessere Kontrolle darüber, welche Abfragen ausgeführt werden. Angesichts der Informationen in der Frage zur Verwendung bedeutet dies:

<?php

class Soya extends AppModel {
    // Assumed from information in the question
    public $useTable = 'users';

    public $belongsTo = array('Grupo');

    // added
    public $actsAs = array('Containable');

}

Ermöglicht Ihnen Folgendes in Ihrem Controller:

$data = $this->Soya->find('list', array(
    'fields'=> array('Soya.id','Soya.username'),
    'contain' => array('Grupo'), // added
    'conditions' => array(
        'Grupo.categoria' => 'Soya' , 
        'Grupo.subcategoria' => 'Productor de Oleaginosas'
    )
));

Dadurch wird die folgende Abfrage generiert (genau ein Join):

SELECT
    "Soya"."id" AS "Soya__id",
    "Soya"."username" AS "Soya__username"
FROM
    "public"."users" as "Soya"
LEFT JOIN
    "public"."Grupos" as "Grupo" on ("Soya"."grupo_id" = "Grupo"."id")
WHERE
   "Grupo"."categoria" = 'Soya' 
    AND 
    "Grupo"."subcategoria" = 'Productor de Oleaginosas'