将相同的模型两次链接到CakePhp中的另一个模型

时间:2014-11-02 21:40:54

标签: php cakephp cakephp-2.3

这可能是一个非常基本的问题,但我无法解决它如何正确解决这个问题。

在我的应用程序中,我的用户拥有多个具有不同目的的地址。例如,用户可以拥有地址和InvoiceAddress。我想将两个地址存储在同一个表(地址模型)中,然后将它们分配给一个用户。

各个模型看起来像:

地址:

 public $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
    ),
    'InvoiceAddress' => array(
        'className' => 'Address',
    ),
);

用户:

public $hasOne = array(
    'Address' => array(
        'className' => 'Address',
    ),
    'InvoiceAddress' => array(
        'className' => 'Address',
    ),
);

当用户有一个地址时,我会将一个user_id作为外键添加到Address模型中并完成它。但显然,CakePhp必须以不同的方式区分地址和发票地址。

在我看来,解决方案就像将一个address_id和invoice_address_id添加到User表中,但我似乎无法以任何方式使其工作。

1 个答案:

答案 0 :(得分:2)

如果您想在用户表格中添加相关字段,则最好使用以下格式address_user_idinvoice_address_user_id添加它们。然后,您的用户模型中必须具有belongsTo关系,如下所示:

public $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_user_id',
    ),
    'InvoiceAddress' => array(
        'className' => 'Address',
        'foreignKey' => 'invoice_address_user_id',
    ),
);

因此,当您执行以下命令$this->User->find('all');时,结果将是

$result = array(0 => 
                array('User' => array(...),
                      'Address' => array(...), // it will bring only one address row
                      'InvoiceAddress' => array(...) // it will bring only one address row
                ),
                1 => ...
                2 => ...
          );

然后在您的地址模型中,您必须添加的关系是:

public $hasOne = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'address_user_id',
    ),
    'InvoiceUser' => array(
        'className' => 'User',
        'foreignKey' => 'invoice_address_user_id',
    )
);