-1

我有 3 个模型 Productproduct_family_id作为 ProductFamily 的外键,ProductFamilycustomer_id作为 Customer 的外键。在产品模型中将递归设置为 2 允许我从客户那里获取产品的客户名称。但是由于数据量很大,它太慢了

尝试使用 Bind 模型如下。没有为我工作。使用 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 所做的一件事是帮助您减少 find() 返回的内容。

可以仅在您将使用它的模型上设置它,并在您找到之前将递归设置为 -1(您将使用“包含”),但在我看来,对所有模型执行此操作是最佳实践

于 2013-07-11T07:05:09.533 回答
0

就像 Alex 在他的回复中提到的那样,您可以使用可包含的行为。他的想法是对整个 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 回答