sql >> Base de Datos >  >> RDS >> PostgreSQL

Falta la entrada de la cláusula FROM para la tabla Grupo cakephp

Necesita que la tabla de grupos se una a la consulta, su consulta en la pregunta no tiene uniones. Hay una serie de soluciones simples.

Definir recursivo.

Recursive es un control muy tosco de qué uniones y consultas se ejecutan, por defecto find('list') tiene un valor recursivo de -1.

-1 significa que no hay uniones, por lo que no hay uniones en la consulta resultante. Si se establece en un valor de 0, se agrega una unión a la consulta principal para todas las asociaciones hasOne y pertenecen a.

Tenga cuidado con el uso o la dependencia de recursos recursivos, ya que es muy fácil generar consultas con uniones que no necesita y/o desencadenar muchas consultas posteriores para datos relacionados (si se establece en un valor superior a 0).

Sin embargo, esta llamada de búsqueda:

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

Debería dar como resultado esta consulta (If el modelo Soya tiene una asociación Pertenece 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'

O usar contenido

El comportamiento contenedor permite un mejor control de las consultas que se ejecutan. Dada la información en la pregunta para usarlo, eso significa:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Le permitirá hacer lo siguiente en su 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'
    )
));

Lo que generará la siguiente consulta (exactamente una unión):

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'