PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

tidak ada entri FROM-klausa untuk tabel Grupo cakephp

Anda memerlukan tabel grupos untuk digabungkan dalam kueri, kueri Anda dalam pertanyaan tidak memiliki gabungan. Ada sejumlah solusi sederhana.

Tentukan rekursif.

Rekursif adalah kontrol yang sangat kasar dari apa yang bergabung dan kueri dieksekusi, secara default find('list') memiliki nilai rekursif -1.

-1 berarti tidak ada yang bergabung, itulah sebabnya tidak ada yang bergabung dalam kueri yang dihasilkan. Menyetelnya ke nilai 0 menambahkan gabungan ke kueri utama untuk semua asosiasi hasOne dan milikTo.

Berhati-hatilah dalam menggunakan/mengandalkan rekursif karena sangat mudah untuk membuat kueri dengan gabungan yang tidak Anda perlukan - dan/atau memicu banyak kueri berikutnya untuk data terkait (jika disetel ke nilai yang lebih besar dari 0).

Namun panggilan pencarian ini:

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

Harus menghasilkan kueri ini (Jika model Soya memiliki asosiasi milik ke 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'

Atau Gunakan yang bisa ditampung

Perilaku yang dapat ditahan memungkinkan kontrol yang lebih baik atas kueri apa yang dieksekusi. Mengingat info dalam pertanyaan untuk menggunakannya itu berarti:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Akan mengizinkan Anda melakukan hal berikut di pengontrol Anda:

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

Yang akan menghasilkan kueri berikut (tepatnya satu gabungan):

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. Kolom tabel kenaikan otomatis

  2. Variabel tabel PostgreSQL

  3. Mungkinkah melakukan kueri lintas basis data dengan PostgreSQL?

  4. EXECUTE...USING pernyataan di PL/pgSQL tidak bekerja dengan tipe record?

  5. Cadangkan PostgreSQL Menggunakan pg_dump dan pg_dumpall