PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

липсва запис на клауза FROM за таблица Grupo cakephp

Трябва таблицата grupos да бъде обединена в заявката, вашата заявка във въпроса няма присъединявания. Има редица прости решения.

Дефиниране на рекурсивно.

Рекурсивният е много груб контрол на това какви обединявания и заявки се изпълняват, по подразбиране find('list') има рекурсивна стойност -1.

-1 означава, че няма обединения, поради което няма присъединяване в получената заявка. Задаването му на стойност 0 добавя присъединяване към основната заявка за всички асоциации hasOne и belongsTo.

Внимавайте да използвате/разчитате на рекурсивно, тъй като е много лесно да генерирате заявки с обединения, които не са ви необходими – и/или да задействате много последващи заявки за свързани данни (ако е зададена стойност, по-голяма от 0).

Обаче това намиране се обажда:

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

Трябва да доведе до тази заявка (Ако моделът Soya има връзка с 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'

Или използвайте contentable

Съдържаемото поведение позволява по-добър контрол на това какви заявки се изпълняват. Предвид информацията във въпроса да го използвате, това означава:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Ще ви позволи да направите следното във вашия контролер:

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

Което ще генерира следната заявка (точно едно присъединяване):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генерирана стойност в Postgres

  2. Създаване на копие на база данни в PostgreSQL

  3. Подаване на параметри WHERE към изглед на PostgreSQL?

  4. Как да надстроите PostgreSQL10 до PostgreSQL11 с нулев престой

  5. Как search_path влияе върху разделителната способност на идентификатора и текущата схема