包含深层关联的CakePHP表单字段在find()之前不起作用

时间:2014-10-07 17:28:56

标签: forms cakephp model associations

我正在编写我的第一个Cake应用程序并尝试建立我的第一个深层关联。它几乎可以工作,但我有几个小问题。

所以我创建了一个表单来添加客户。客户有很多地址,地址有很多联系人。我遇到的问题是,表单助手似乎无法识别联系人字段以进行格式化。但是,如果我在动作中执行find(),则表单会正确显示。就像模型在使用之前没有链接一样。

Here's the 3 models:

class Customer extends AppModel {
    public $hasMany = 'CustomerAddress';
}

class CustomerAddress extends AppModel {
    public $belongsTo = 'Customer';
    public $hasMany = 'CustomerContact';
}

class CustomerContact extends AppModel {
    public $belongsTo = 'CustomerAddress';
}

在提交之前,添加操作基本上什么也没做,所以我不打算发帖,但是这里有一些摘录:

add.ctp

echo $this->Form->input('CustomerAddress.0.CustomerContact.title', 'options' => array( 'Mr' => 'Mr', 'Miss' => 'Miss', 'Mrs' => 'Mrs', 'Ms' => 'Ms', 'Dr' => 'Dr')))."\n";
echo $this->Form->input('CustomerAddress.0.CustomerContact.first')."\n";
echo $this->Form->input('CustomerAddress.0.CustomerContact.last')."\n";
.....

echo $this->Form->input('CustomerAddress.address1')."\n";
echo $this->Form->input('CustomerAddress.address2')."\n";
.....

echo $this->Form->input('type', array( 'label' => 'Business Customer?'))."\n";

因此,CustomerAddress字段工作正常,它们是正确的类型,有限的长度等以匹配数据库,但CustomerContact字段根本不起作用。同样,如果我提交无效数据,则添加操作会执行saveAll并失败,但表单字段会正确显示。

如果我在显示页面之前向操作添加了find(),它们可以正常工作。在使用模型之前,它不会被包含在内。

我确定这可能是一个简单的命令,让它来阅读模型或其他东西,但我有点卡住它。

1 个答案:

答案 0 :(得分:1)

好的,经过多次挖掘,我通过调用控制器上的->loadModel来实现这一点。因为在这种情况下我几乎在每种情况下都需要加载所有3个模型,我每次都添加beforeFilter来执行此操作。

我没有更改任何模型的代码,但是将其添加到控制器:

CustomerController.php 

class CustomerController extends AppController {
    public $helpers = array( 'Html', 'Form', 'Humanize');

    public function beforeFilter() {
        // Load associated models
        $this->loadModel( 'CustomerAddress');
        $this->loadModel( 'CustomerContact');
    }

    .....
}

即使从Customer模型而不是CustomerAddress模型加载CustomerContact模型,Cake似乎也尊重该关系并将其加载到CustomerAddress下。起初,我尝试过:

$this->CustomerAddress->loadModel( 'CustomerContact'); 

但它失败了。似乎这样工作得很好。