sql >> データベース >  >> RDS >> PostgreSQL

テーブルGrupocakephpのFROM句エントリがありません

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

    このクエリが発生するはずです( If SoyaモデルにはGrupoへのbelongsToアソシエーションがあります):

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

    これにより、次のクエリ(正確に1つの結合)が生成されます:

    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. Oracleデータベース内のすべての関数とプロシージャのリストを取得します

    2. PostgreSQLの実行速度が遅い?ソースに到達するためのヒントとコツ

    3. PostgreSQLのディザスタリカバリにBarmanを使用する

    4. Debian 6でMySQLリレーショナルデータベースを使用する(Squeeze)