2010-09-07 133 views
0

在我的CakePHP应用程序中,我有一个名为'Customer'的模型,它描述了(不出意料的)单个客户。然后我有一个关于销售的'销售'模型。 (每个销售一个客户,每个客户销售很多)。然后每个销售都有一个'car_id'(映射到'Car'模型)和一个'engine_id'(映射到'Engine model')。目前,当我获得一位顾客的详细信息时,它会提取与该顾客相关的每个销售的详细信息,但我希望更深入一步,并为每次销售确定每辆汽车和每台发动机的详细信息。我该怎么做呢?CakePHP从多个模型获取数据

我明白模型之间的关系,但我明显错过了一些东西。我的当前设置是这样的...

Customer: $hasMany = 'Sales';

Sale: $hasOne = array('Car', 'Engine');

显然,“汽车”和“引擎”没有sale_id相关的,因为他们可以属于很多不同的销售。

回答

1

时退房中可容纳的行为,它应该让你做你需要的一切: http://book.cakephp.org/view/1323/Containable

在这种情况下,一旦你让你的模型中容纳,你可以做这样的事情:

$this->Customer->find('first', array(
    conditions -> array(
     'id' -> $customer_id), 
    contain -> array(
     'Sale' -> array(
      'Car', 'Engine')))); 

您还可以指定包含在每个模型中的哪些字段和条件。

+0

您的代码将无法正常工作 - 你需要附上销售,汽车,引擎引号。我也认为这主要是为了检索数据。 – 2010-09-07 16:05:58

+0

谢谢,加了引号,也没有足够的括号。我理解这个问题,就是关于数据检索。 – bjudson 2010-09-07 20:38:34

1

据我了解,你们的关系如下:

Customer -> Sale -> Car -> Engine 

直线,这意味着汽车不相关的客户,除了通过出售。如果这是正确的,你只需要设置你的人际关系中每个模型,使他们正确识别:

Customer hasMany Sale 
Sale belongsTo Customer 
Sale hasMany Car 
Car belongsTo Sale 
Car hasMany Engine 
Engine belongsTo Car 

然后,当你查询数据库,你可以这样做:

$this->Customer->find('first', array(
    'conditions' => array('id' => $ID), 
    'recursive' => 1   // or 2 depending on your need 
) 
); 

这将允许您很容易地钻取数据。

了解更多关于在这里:​​http://book.cakephp.org/view/73/Retrieving-Your-Data

+0

在递归中使用超过2个(甚至2个是危险的)只有一个警告可能导致递归,即客户拥有许多销售和销售给客户。更好的选择是使用Containable行为。 – 2010-09-07 17:53:02

0

我觉得你的模型关系(和cdburgess)是错误的。它应该是这样的:

Customer hasMany Sale 
Sale belongsTo Customer 
Car hasMany Sale 
Sale belongsTo Car 
Engine hasMany Sale 
Sale belongsTo Engine 

然后,您可以使用中可容纳的行为来获取所有的相关数据:

$this->Customer->Behaviors->attach('Containable'); 
$this->recursive = -1; 
$this->Customer->find('first', array(
    'conditions' => array('id' => $ID), 
    'contain' => array('Sale' => array('Car', 'Engine')) 
));