PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

entrée manquante de la clause FROM pour la table Grupo cakephp

Vous avez besoin que la table grupos soit jointe dans la requête, votre requête dans la question n'a pas de jointure. Il existe plusieurs solutions simples.

Définissez récursif.

Récursif est un contrôle très grossier des jointures et des requêtes exécutées, par défaut find('list') a une valeur récursive de -1.

-1 signifie aucune jointure, c'est pourquoi il n'y a pas de jointure dans la requête résultante. Le définir sur une valeur de 0 ajoute une jointure à la requête principale pour toutes les associations hasOne et namesTo.

Méfiez-vous d'utiliser/de vous fier à la récursivité car il est très facile de générer des requêtes avec des jointures dont vous n'avez pas besoin - et/ou de déclencher de nombreuses requêtes ultérieures pour des données associées (si la valeur est supérieure à 0).

Cependant cet appel de recherche :

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

Devrait aboutir à cette requête (Si le modèle Soya a une association d'appartenance à 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 Utiliser Contenable

Le comportement confinable permet un meilleur contrôle des requêtes exécutées. Étant donné les informations dans la question pour l'utiliser, cela signifie :

<?php

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

    public $belongsTo = array('Grupo');

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

}

Vous permettra de faire ce qui suit dans votre contrôleur :

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

Ce qui générera la requête suivante (exactement une jointure) :

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'