PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

तालिका Grupo Cakephp के लिए FROM-क्लॉज प्रविष्टि गुम है

क्वेरी में शामिल होने के लिए आपको ग्रुप्स टेबल की आवश्यकता है, प्रश्न में आपकी क्वेरी में कोई जॉइन नहीं है। कई सरल उपाय हैं।

पुनरावर्ती परिभाषित करें।

रिकर्सिव डिफ़ॉल्ट रूप से find('list') जो भी जुड़ता है और क्वेरीज़ निष्पादित की जाती है, का एक बहुत ही मोटा नियंत्रण है। -1 का पुनरावर्ती मान है।

-1 का अर्थ है नो जॉइन, यही वजह है कि परिणामी क्वेरी में कोई जॉइन नहीं है। इसे 0 के मान पर सेट करने से सभी के लिए मुख्य क्वेरी में शामिल हो जाता है एक और संबंधित संघों के लिए।

रिकर्सिव का उपयोग करने/आश्रित करने से सावधान रहें क्योंकि आपको जिन जॉइन की आवश्यकता नहीं है उनके साथ क्वेरी जेनरेट करना बहुत आसान है - और/या संबंधित डेटा के लिए कई बाद के प्रश्नों को ट्रिगर करना (यदि 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'
    )
));

इस क्वेरी का परिणाम होना चाहिए (अगर सोया मॉडल का ग्रुपो से संबंध है):

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'

या उपयोग करने योग्य का उपयोग करें

सम्‍मिलित व्यवहार बेहतर नियंत्रण की अनुमति देता है कि कौन से प्रश्न निष्पादित किए जाते हैं। प्रश्न में दी गई जानकारी का उपयोग करने के लिए इसका अर्थ है:

<?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. एंटिटी फ्रेमवर्क कोर के साथ आंशिक प्राथमिक कुंजी पर ऑटो-इन्क्रीमेंट

  2. Java.sql.Timestamp के साथ Joda-Time का उपयोग कैसे करें?

  3. search_path पहचानकर्ता संकल्प और वर्तमान स्कीमा को कैसे प्रभावित करता है

  4. डेबियन/उबंटू पर एक पोस्टग्रेएसक्यूएल प्रतिकृति सेटअप बनाना

  5. मैं Postgres 9.3 में वर्तमान समयक्षेत्र का नाम कैसे प्राप्त करूं?