0

CakePHP 1.3 を使用していますが、SQL クエリを CakePHP に変換する際に問題が発生しています。クエリの背後にある概念は、指定されたアカウントに関連付けられ、特定の製品カテゴリまたは指定されたカテゴリの直接の子に属するすべての製品を取得することです。

ここには、products、product_categories、category_types の 3 つのテーブルが含まれます。product_categories は、製品を category_types に結合するリンク テーブルです。category_types テーブルは、それ自体に結合できるツリー構造です。

カテゴリの ID が 1 でアカウントの ID が 1 の場合、クエリの SQL は次のようになります。

SELECT Product.id, Product.name, Product.account_id
FROM products AS Product
INNER JOIN product_categories AS pc ON (Product.id = pc.product_id) 
INNER JOIN category_types AS ct ON (ct.id = pc.category_type_id) 
WHERE ( 
   ((Product.account_id IS NULL) OR (Product.account_id = '1'))
   AND ((ct.id = '1') OR (ct.parent_id = '1')) 
)

これを試して実行するために使用しているコードは次のとおりです。これは、モデルの関数にあります。

$this->find('all', array(
    'joins' => array(
        array(
            'table' => 'product_categories',
            'alias' => 'pc',
            'type' => 'INNER',
            'conditions' => array(
                'Product.id = pc.product_id'
            )
        ),
        // get category type
        array(
            'table' => 'category_types',
            'alias' => 'ct',
            'type' => 'INNER',
            'conditions' => array(
                'pc.category_type_id = ct.id'
            )
        )
    )            
    , 'conditions'=> array(
        'OR' => array(
            'Product.account_id IS NULL'
            , 'Product.account_id' => $account_id
        )
        , 'OR' => array(
            'ct.id' => $categoryTypeId
            , 'ct.parent_id' => $categoryTypeId
        )
    )
));

問題は、クエリが account_id OR 条件を無視しているため、SQL が次のようになることです。

SELECT Product.id, Product.name, Product.account_id
FROM products AS Product
INNER JOIN product_categories AS pc ON (Product.id = pc.product_id) 
INNER JOIN category_types AS ct ON (ct.id = pc.category_type_id) 
WHERE ((ct.id = '1') OR (ct.parent_id = '1'))

php コードを変更して目的の結果を得るにはどうすればよいですか?

4

2 に答える 2

0

私を正しい方向に向けてくれたuser2076809に感謝します。解決策は、2 つの OR 条件をそれぞれ独自の配列にラップすることです。

$this->find('all', array(
    'joins' => array(
        array(
            'table' => 'product_categories',
            'alias' => 'pc',
            'type' => 'INNER',
            'conditions' => array(
                'Product.id = pc.product_id'
            )
        ),
        // get category type
        array(
            'table' => 'category_types',
            'alias' => 'ct',
            'type' => 'INNER',
            'conditions' => array(
                'pc.category_type_id = ct.id'
            )
        )
    ),            
    'conditions'=> array(
        array(
            'OR' => array(
                'Product.account_id IS NULL'
                , 'Product.account_id' => $account_id
            )
        ),
        array(
            'OR' => array(
                'ct.id' => $categoryTypeId
                , 'ct.parent_id' => $categoryTypeId
            )
        )
    )
));
于 2013-10-10T20:09:32.250 に答える