sql >> Database teknologi >  >> RDS >> PostgreSQL

mangler FROM-klausulindgang for tabel Grupo cakephp

Du skal bruge grupos-tabellen for at blive tilsluttet i forespørgslen, din forespørgsel i spørgsmålet har ingen joinforbindelser. Der er en række simple løsninger.

Definer rekursiv.

Rekursiv er en meget grov kontrol af, hvilke joinforbindelser og forespørgsler der udføres, som standard find('list') har en rekursiv værdi på -1.

-1 betyder ingen joinforbindelser, hvorfor der ikke er nogen join i den resulterende forespørgsel. Hvis du indstiller den til en værdi på 0, tilføjes en joinforbindelse til hovedforespørgslen for alle hasOne- og belongsTo-foreninger.

Vær forsigtig med at bruge/stole på rekursivt, da det er meget nemt at generere forespørgsler med joinforbindelser, du ikke har brug for - og/eller udløse mange efterfølgende forespørgsler for relaterede data (hvis indstillet til en værdi større end 0).

Men dette find kalder:

$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 resultere i denne forespørgsel (Hvis Soya-modellen har en tilhører-tilknytning til 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 brug containable

Den indholdsmæssige adfærd giver bedre kontrol over, hvilke forespørgsler der udføres. Givet oplysningerne i spørgsmålet for at bruge det, 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');

}

Vil tillade dig at gøre følgende i din controller:

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

Hvilket vil generere følgende forespørgsel (nøjagtig én 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. adgang nægtet for indlæsning af data i MySQL

  2. Sådan opretter du en tabel i MySQL Workbench ved hjælp af GUI

  3. PostgreSQL:Fjern attribut fra JSON-kolonnen

  4. ScaleGrid nu tilgængelig i Sydney AWS-regionen