PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

thiếu mục nhập mệnh đề FROM cho bảng Grupo cakephp

Bạn cần liên kết bảng grupos trong truy vấn, truy vấn của bạn trong câu hỏi không có liên kết nào. Có một số giải pháp đơn giản.

Xác định đệ quy.

Đệ quy là một điều khiển rất thô đối với những gì nối và truy vấn được thực thi, theo mặc định find('list') có giá trị đệ quy là -1.

-1 có nghĩa là không có liên kết, đó là lý do tại sao không có liên kết nào trong truy vấn kết quả. Đặt nó thành giá trị 0 sẽ thêm một phép nối vào truy vấn chính cho tất cả các liên kết hasOne và underTo.

Hãy cảnh giác với việc sử dụng / dựa vào đệ quy vì rất dễ tạo truy vấn với các phép nối mà bạn không cần - và / hoặc kích hoạt nhiều truy vấn tiếp theo cho dữ liệu liên quan (nếu được đặt thành giá trị lớn hơn 0).

Tuy nhiên, cuộc gọi tìm kiếm này:

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

Sẽ dẫn đến truy vấn này ( Nếu mô hình Soya có liên kết thuộc về 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'

Hoặc Sử dụng có thể chứa được

Hành vi có thể chứa cho phép kiểm soát tốt hơn những gì truy vấn được thực thi. Đưa ra thông tin trong câu hỏi để sử dụng nó có nghĩa là:

<?php

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

    public $belongsTo = array('Grupo');

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

}

Sẽ cho phép bạn thực hiện những việc sau trong bộ điều khiển của mình:

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

Điều nào sẽ tạo ra truy vấn sau (chính xác là một kết hợp):

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. Cách tránh cuộc gọi kích hoạt vòng lặp trong PostgreSQL 9.2.1

  2. PSQLException:giao dịch hiện tại bị hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch

  3. Oracle đến PostgreSQL:Cú pháp nối ngoài ANSI trong PostgreSQL

  4. Truy vấn phải để lấy số lượng kết nối hiện tại trong Cơ sở dữ liệu PostgreSQL

  5. Cột PostgreSQL không tồn tại nhưng nó thực sự có