sql >> Databáze >  >> RDS >> PostgreSQL

chybí položka klauzule FROM pro tabulku Grupo cakephp

Potřebujete, aby byla v dotazu připojena tabulka grupos, váš dotaz v otázce nemá žádná spojení. Existuje řada jednoduchých řešení.

Definujte rekurzivní.

Rekurzivní je velmi hrubé ovládání toho, jaké spojení a dotazy se provádějí, ve výchozím nastavení find('list') má rekurzivní hodnotu -1.

-1 znamená žádná spojení, což je důvod, proč ve výsledném dotazu není žádné spojení. Nastavení na hodnotu 0 přidá spojení k hlavnímu dotazu pro všechna přidružení hasOne a PatriTo.

Dejte si pozor na použití/spoléhání se na rekurzivní, protože je velmi snadné generovat dotazy se spojeními, která nepotřebujete – a/nebo spouštět mnoho následných dotazů na související data (pokud je nastaveno na hodnotu větší než 0).

Nicméně toto najít volání:

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

Výsledkem by měl být tento dotaz (Pokud model Soya má přidružení patří ke skupině 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'

Nebo použijte obsah

Obsažitelné chování umožňuje lepší kontrolu nad tím, jaké dotazy se provádějí. Vzhledem k informacím v otázce to použít, to znamená:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Umožní vám ve vašem ovladači provádět následující:

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

Což vygeneruje následující dotaz (přesně jedno spojení):

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'


  1. Jak nainstalovat Oracle Linux Automation Manager (aka „Oracle Ansible Tower“)

  2. Převést „datetime2“ na „smalldatetime“ v SQL Server (příklady T-SQL)

  3. Procedura UTL_FILE.FOPEN() nepřijímá cestu k adresáři?

  4. Vyberte pouze dnešní (od půlnoci) časová razítka