cakeCake PHP仅当数据存在时保存关联记录


cakeCake PHP Save Associated record only when data exists

我目前正在学习蛋糕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);单独留在那里,如果有保存错误会发生什么,你会让它通过而不警告用户吗?