我目前正在学习蛋糕PHP,并遇到了一些问题,我似乎无法克服。如果有人能提供任何建议,我将不胜感激。
对于我的问题,我有两个表:租户和sub_租户。
这是我的租户模型:
// app/Model/Tenant.php
class Tenant extends AppModel {
public $hasMany = 'SubTenants';
}
我的视图中有一个表单,允许同时输入一个租户和最多四个子租户。这是我的观点:(为了简化而省略了额外的不相关代码)
<?php echo $this->Form->create('Tenant'); ?>
<?php echo $this->Form->input('full_name') ?>
<?php echo $this->Form->input('email') ?>
<?php echo $this->Form->input('SubTenants.0.full_name', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.0.email', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.1.full_name', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.1.email', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.2.full_name', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.2.email', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.3.full_name', array('label' => 'Full Name')) ?>
<?php echo $this->Form->input('SubTenants.3.email', array('label' => 'Full Name')) ?>
<?php echo $this->Form->end()?>
然后在租户控制器中使用saveasassociated保存此数据,如下所示:
public function new_tenant() {
if ($this->request->is('post')) {
$this->Tenant->saveAssociated($this->request->data);
}
}
只要完成所有四个子租户表单,就可以正常工作;但是,我需要子承租者数据是可选的和/或可变的(有时可能少于四个子承租者)
有没有人能告诉我如何才能做到这一点,是否有可能使用saveasassociated ?
如果您让代码保持原样并尝试保存子租户1和4,那么您将在2和3中得到验证错误(例如,如果您有一个"notEmpty"规则)。如果在SubTenant模型中没有验证,则将保存所有子租户(1到4),但2和3将为空。
所以你必须修改你的代码。
public function new_tenant() {
if ($this->request->is('post')) {
$subsToSave = array();
foreach ($this->request->data['SubTenants'] as $index => $subtenant) {
if ($subtenant['fullname'] != '' && $subtenant['email'] != '')
$subsToSave[] = $subtenant;
}
$this->Tenant->saveAssociated(array('SubTenants'=>$subsToSave));
}
}
但是这样的数据验证不能保证落在同一主题上。例如,如果您填写了子租户1和4,并且在两个名称上都添加了数字(假设您有一个不接受名称上的数字的数据验证),那么对于第二个代码,表单错误可能会落在视图中的子租户1和2上。
无论哪种方式,一定要在保存时捕获错误,不要把$this->Tenant->saveAssociated($this->request->data);
单独留在那里,如果有保存错误会发生什么,你会让它通过而不警告用户吗?