我正在编写我的第一个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(),它们可以正常工作。在使用模型之前,它不会被包含在内。
我确定这可能是一个简单的命令,让它来阅读模型或其他东西,但我有点卡住它。
答案 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');
但它失败了。似乎这样工作得很好。