PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

entrada de cláusula FROM ausente para a tabela Grupo cakephp


Você precisa que a tabela de grupos seja unida na consulta, sua consulta na pergunta não possui junções. Existem várias soluções simples.

Defina recursivo.


Recursivo é um controle muito grosseiro de quais junções e consultas são executadas, por padrão find('list') tem um valor recursivo de -1.

-1 significa sem junções, razão pela qual não há junção na consulta resultante. Defini-lo com um valor de 0 adiciona uma junção à consulta principal para todas as associações hasOne e belongsTo.

Desconfie de usar/depender de recursividade, pois é muito fácil gerar consultas com junções que você não precisa - e/ou acionar muitas consultas subsequentes para dados relacionados (se definido com um valor maior que 0).

No entanto, este find chama:
$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'
    )
));

Deve resultar nesta consulta (Se o modelo Soja tem uma associação pertence ao 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'

Ou Use contáveis


O comportamento de contenção permite um melhor controle de quais consultas são executadas. Dadas as informações na pergunta para usá-lo, isso significa:
<?php

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

    public $belongsTo = array('Grupo');

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

}

Permitirá que você faça o seguinte em seu controlador:
$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'
    )
));

Que irá gerar a seguinte consulta (exatamente uma junção):
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'