0

最初に、私は MVC フレームワークを初めて使用するので、その分野の知識を前提としないでください。

デザイナー モデルがあり、デザイナー モデルから情報を取得するときに、各デザイナーに関連する製品を取得したいと考えています。

関連付けは単純ではないため、cake が魔法のように関連付けを行うわけではないので、自分で定義する必要があります。私はチュートリアルに従ってきましたが、近いと思いますが、すべてを結び付ける方法がわかりません。

designer_id を適切な場所に挿入すると、関連するすべての製品が選択されるという非常に長いクエリがあります。

製品を取得する方法を認識できるように、このクエリを Designer モデルのどこかに配置する必要があると思います。

これがクエリです。次のように見える文字列の部分は、次のよう{$__cakeID__$}に置き換える必要がありますdesigner_id

SELECT *, COUNT(DISTINCT tags.name) AS uniques 
FROM products, products_tags, tags, designers, designers_tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id IN (
    SELECT t.id
    FROM tags t
    LEFT JOIN designers_tags dt ON dt.tag_id = t.id
    LEFT JOIN designers d ON d.id = dt.designer_id
    WHERE d.id ={$__cakeID__$}
    AND dt.include =1
)
AND products.id NOT IN ( 
    SELECT products.id 
    FROM products, products_tags, tags 
    WHERE products.id = products_tags.product_id 
    AND tags.id = products_tags.tag_id 
    AND tags.id IN (
        SELECT t.id
        FROM tags t
        LEFT JOIN designers_tags dt ON dt.tag_id = t.id
        LEFT JOIN designers d ON d.id = dt.designer_id
        WHERE d.id ={$__cakeID__$}
        AND dt.include =0
    ) 
)
AND designers.id = designers_tags.designer_id
AND designers_tags.tag_id = tags.id
GROUP BY products.id 
HAVING uniques = (
    SELECT COUNT(d.id) AS tag_count 
    FROM tags t
    LEFT JOIN designers_tags dt 
        ON dt.tag_id = t.id
    LEFT JOIN designers d 
        ON d.id = dt.designer_id
    WHERE d.id = {$__cakeID__$} 
    AND dt.include =1
    GROUP BY d.id
)

また、デザイナーモデルは次のとおりです。

class Designer extends AppModel 
{    
    var $name = 'Designer';

    var $actsAs = array('Sluggable' => array('separator' => '-', 'overwrite' => false, 'label' => 'name')); 

    var $hasAndBelongsToMany = 'Tag';

    var $hasOne = 'AlternateName';

    var $hasMany = 'Vote';
}

Designer モデルがこのクエリを使用して関連する製品を自動的に検索するようにするには、どうすればよいですか?

4

1 に答える 1

0

このクエリは、アドホック結合と Containable 動作を使用して機能するはずです。

// this assumes you are in the DesignersController
$this->Designer->Tag->find('all', array(
    'joins' => array(
        array(
            'table' => 'designers_tags',
            'alias' => 'FilterDesignersTag',
            'type' => 'INNER',
            'conditions' => array(
                'FilterDesignersTag.tag_id = Tag.id'
            )
        )
    ),
    'contain' => array('Designer', 'Product'),
    'conditions' => array(
        'FilterDesignersTag.designer_id' => $designer_id,
        'FilterDesignersTag.include' => 1
    )
));

データはタグに合わせて返されますが、必要なものは得られます。Designerまた、 、Product、およびの 3 つのモデルすべてで HABTM 関係を定義する必要がありますTag(タグには 2 つの HABTM 関連付けが必要です)。

また、モデルに追加する必要がありvar $actsAs = array('Containable');ます。

編集

CakePHP のソリューションが見つからず、生のクエリを使用する必要が生じた場合、CakePHP はモデルクエリ メソッドを使用してそれを行うことができます。この方法を使用すると、いくつかの機能を放棄していることを理解してください。また、クックブックからの次のアドバイスにも注意してください。

アプリケーションでこのメソッドを使用したことがある場合は、CakePHP の Sanitize ライブラリを確認してください。これは、ユーザーが提供したデータをインジェクションやクロスサイト スクリプティング攻撃からクリーンアップするのに役立ちます。

于 2010-12-22T18:37:19.087 に答える