sql >> Databasteknik >  >> RDS >> PostgreSQL

saknas FROM-klausulpost för tabellen Grupo cakephp

Du behöver grupostabellen för att anslutas i frågan, din fråga i frågan har inga joins. Det finns ett antal enkla lösningar.

Definiera rekursiv.

Rekursiv är en mycket grov kontroll av vilka kopplingar och frågor som exekveras, som standard find('list') har ett rekursivt värde på -1.

-1 betyder inga joins, vilket är anledningen till att det inte finns någon join i den resulterande frågan. Om du ställer in det till värdet 0 läggs en koppling till huvudfrågan för alla hasOne- och belongsTo-föreningar.

Var försiktig med att använda/lita på rekursiv eftersom det är mycket enkelt att generera frågor med kopplingar som du inte behöver - och/eller trigga många efterföljande frågor för relaterade data (om inställt på ett värde större än 0).

Men detta hitta samtal:

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

Bör resultera i den här frågan (Om Sojamodellen har en tillhörighetsassociation till 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'

Eller använd containable

Det innehållsbara beteendet ger bättre kontroll över vilka frågor som exekveras. Med tanke på informationen i frågan för att använda den betyder det:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Tillåter dig att göra följande i din handkontroll:

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

Vilket genererar följande fråga (exakt en 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'


  1. Fel vid installation av mysql2:Det gick inte att bygga gem native extension

  2. generera dagar från datumintervall

  3. Duplicera, kopiera eller säkerhetskopiera tabeller i MySQL, MariaDB, Oracle, PostgreSQL, DB2 och SQLite med Skapa tabell som SQL

  4. java.lang.ClassNotFoundException:org.postgresql.Driver