PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

brak wpisu klauzuli FROM dla tabeli Grupo cakephp

Potrzebujesz, aby tabela grupos była sprzężona w zapytaniu, Twoje zapytanie w pytaniu nie zawiera złączeń. Istnieje wiele prostych rozwiązań.

Zdefiniuj rekurencyjne.

Rekursywny to bardzo zgrubna kontrola nad tym, jakie sprzężenia i zapytania są wykonywane, domyślnie find('list') ma rekurencyjną wartość -1.

-1 oznacza brak złączeń, dlatego w wynikowym zapytaniu nie ma złączenia. Ustawienie jej na wartość 0 dodaje sprzężenie do głównego zapytania dla wszystkich asocjacji hasOne i submitTo.

Uważaj na używanie / poleganie na rekursywności, ponieważ bardzo łatwo jest generować zapytania ze sprzężeniami, których nie potrzebujesz - i/lub wyzwalać wiele kolejnych zapytań o powiązane dane (jeśli ustawiono wartość większą niż 0).

Jednak to znajdź wywołanie:

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

Powinno spowodować to zapytanie (Jeśli model Soya należy do stowarzyszenia 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'

Lub użyj kontenera

Zawarte zachowanie umożliwia lepszą kontrolę nad wykonywanymi zapytaniami. Biorąc pod uwagę informacje w pytaniu, aby go użyć, oznacza to:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Pozwoli ci wykonać następujące czynności w kontrolerze:

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

Które wygeneruje następujące zapytanie (dokładnie jedno sprzężenie):

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. PostgreSQL nie może rozpocząć/zakończyć transakcji w PL/pgSQL

  2. Jak EDB stał się liderem na rynku Postgres

  3. Monitorowanie dystrybucji Percona dla PostgreSQL — kluczowe metryki

  4. Liczba warunkowych zapytań SQL

  5. PostgreSQL:jak przekonwertować z epoki Uniksa do tej pory?