PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

voce della clausola FROM mancante per la tabella Grupo cakephp

È necessario che la tabella grupos sia unita nella query, la query nella domanda non ha join. Esistono diverse soluzioni semplici.

Definisci ricorsivo.

Il ricorsivo è un controllo molto grossolano di quali join e query vengono eseguiti, per impostazione predefinita find('list') ha un valore ricorsivo di -1.

-1 significa nessun join, motivo per cui non ci sono join nella query risultante. Impostandolo su un valore di 0 si aggiunge un join alla query principale per tutte le associazioni hasOne e appartiene a.

Diffida dall'usare/fare affidamento su ricorsivi poiché è molto facile generare query con join non necessari e/o attivare molte query successive per dati correlati (se impostato su un valore maggiore di 0).

Tuttavia questa trova chiamata:

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

Dovrebbe risultare in questa query (If il modello Soya ha un'associazione appartiene a 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'

Oppure usa contenibile

Il comportamento contenibile consente un migliore controllo di quali query vengono eseguite. Date le informazioni nella domanda per usarlo significa:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Ti permetterà di fare quanto segue nel tuo 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'
    )
));

Che genererà la seguente query (esattamente un 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'