-1

ProductFamily への外部キーとして持つ 3 つのモデル製品と、Customer への外部キーとしてのproduct_family_idProductFamily を持つ 3 つのモデルがありcustomer_idます。Product モデルに 2 を再帰的に配置すると、製品の Customer から Customer 名を取得できます。しかし、データが膨大なので遅すぎる

以下のようにバインドモデルを使用してみました。私にはうまくいきませんでした。Cakephp フレームワークを使用します。

$this->Product->bindModel(array(
'belongsTo' => array(
               'ProductFamily' => array(
                   'foreignKey' => false,
                   'conditions' => 
                        array('Product.product_family_id = ProductFamily.id')
                   ),
               'Customer' => array(
                   'foreignKey' => false,
                   'conditions' => 
                        array('ProductFamily.customer_id = Customer.id')
                   )
               )
           )); 
4

2 に答える 2

1

コンテナを使用

Containable 動作は、再帰的な 2 のオーバーヘッドなしで、必要なデータを正確に取得するのに役立ちます

AppModel に設定して、すべてのモデルに一度に適用し、使用方法についてドキュメントを読んでください。

class AppModel extends Model {

    public $actsAs = array('Containable');
    public $recursive = -1;
}

アプリケーションの一部のインターフェイスでは、モデルからの情報があまり必要ない場合があります。ContainableBehavior が行うことの 1 つは、find() が返すものを削減するのに役立ちます。

これを使用するモデルでのみこれを設定し、検索の直前に recursive を -1 に設定することは可能ですが ('contain' を使用します)、すべてのモデルでこれを行うのがベスト プラクティスです。

于 2013-07-11T07:05:09.533 に答える
0

Alex が応答で述べたように、containable 動作を使用できます。彼のアイデアは、AppModel 全体に Containable 動作を使用することです。つまり、すべてのモデルに影響します。また、コードの他の場所で既に再帰を使用している場合は、モデルを調整してそれらの各部分に含める必要があります。

ただし、このモデルのデータのみを制限したい場合。できるよ

$this->Product->Behaviors->attach('Containable');
$this->Product->contain(array(
    'ProductFamily' => array('Fields you need from product family'), 
    'Customer' => array('Fields from customer')
);

ProductFamily と Customer のすべてのフィールドが必要な場合は、次のことができます。

$this->Product->contain(array('ProductFamily', 'Customer'));
于 2013-07-11T08:04:30.497 に答える