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

时间:2014-06-17 15:30:29

标签: php cakephp

我目前正在学习Cake PHP并且遇到了一些我似乎无法克服的问题。如果有人可以提供任何建议,我们将不胜感激。

就我的问题而言,我有两个表:租户和子租户。

这是我的租户模特:

// 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()?> 

在租户控制器中,我使用saveAssociated保存这些数据,如下所示:

public function new_tenant() {
        if ($this->request->is('post')) {
            $this->Tenant->saveAssociated($this->request->data);
        }   
    }

只要所有四个分租户表格完成,这项工作正常;但我需要子租户数据是可选的和/或可变的(有时可能少于四个子租户)

有人可以告诉我如何解决这个问题,是否可以使用saveAssociated来做到这一点?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果保留代码并尝试保存子代理1和4,那么您将在2和3中获得验证错误(例如,如果您有&#34; notEmpty&#34;规则) 。如果您未在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,并且您在两个名称上都添加了一个数字(假设您的数据验证不接受名称上的数字),那么使用第二个代码,表格错误可能会落在视图中的subtenant 1和2上。

嗯,无论哪种方式,一定要抓住保存时的错误,不要单独留下$this->Tenant->saveAssociated($this->request->data);,如果出现保存错误会怎么样,你打算让它出现吗?通过而不是警告用户?