sql >> Database >  >> RDS >> PostgreSQL

ontbrekende FROM-clausule voor tabel Grupo cakephp

Je hebt de grupos-tabel nodig om in de query te worden samengevoegd, je query in de vraag heeft geen joins. Er zijn een aantal eenvoudige oplossingen.

Definieer recursief.

Recursief is een zeer grove controle van welke joins en query's worden uitgevoerd, standaard find('list') heeft een recursieve waarde van -1.

-1 betekent geen joins, daarom is er geen join in de resulterende query. Als u dit instelt op een waarde van 0, wordt een join toegevoegd aan de hoofdquery voor alle hasOne- en behoortTo-associaties.

Wees op uw hoede voor het gebruik van/vertrouwen op recursief omdat het heel eenvoudig is om zoekopdrachten te genereren met joins die u niet nodig hebt - en/of het activeren van veel daaropvolgende zoekopdrachten voor gerelateerde gegevens (indien ingesteld op een waarde groter dan 0).

Maar deze vondst roept:

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

Moet resulteren in deze zoekopdracht (Als het Soya-model heeft een behoortTo-associatie met 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'

Of gebruik bevatbaar

Het beheersbare gedrag zorgt voor een betere controle over welke query's worden uitgevoerd. Gezien de informatie in de vraag om het te gebruiken, betekent dit:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Hiermee kunt u het volgende doen in uw 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'
    )
));

Wat de volgende query genereert (precies éé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. Hoe test ik een Oracle Stored Procedure met RefCursor-retourtype?

  2. Hoe kan ik MariaDB wijzigen in MySQL in XAMPP?

  3. alfa en numeriek splitsen met sql

  4. Hoe maak je een back-up van RAC VM's