2014-04-27 33 views
0

问题:如何在CakePHP中对SaveAssociated和Save函数调用进行模型验证(特别是对于子模型)中的相同代码......给定SaveAssociated实现期望表单数据数组包含属于子模型的数据字段的数字索引[0]?CakePHP SaveAssociated和保存 - 使用相同的模型验证代码

场景:

假设我有一个的hasMany关系到几个子模型父模型。

通常,如果使用SaveAssociated将数据一次保存到所有模型,则需要在视图表单输入上指定索引编号(通常为0)。例如:

echo $this->Form->input('MerchantControl.0.startdate', array('type' => 'text', 'class' => 'datepicker_start')); 

其结果是,任何自定义子模型的验证代码将需要与被写入[0]为好。请参阅下面的代码示例中的函数urlParamNotUsedByOtherMerchants。

public $validate = array(
    'urlparam' => array(
     'In Use by other Merchants' => array(
      'rule' => 'urlParamNotUsedByOtherMerchants', 
      'message' => 'URLPARAM belongs to another Merchant' 
     ) 
    ) 
); 


public function urlParamNotUsedByOtherMerchants($data) { 
    $searchfilter = array(
         //Because of SaveAssociated, need to refer to index [0] 
         'MerchantControl.id !=' => $this->data['MerchantControl'][0]['merchant_id'], 
         'MerchantControl.urlparam ' => $data, 
         );   
    $merchantcontrol = $this->find('all', array('conditions' => $searchfilter)); 
    if (sizeof($merchantcontrol) > 0) { 
     return false; 
    } else { 
     return true; 
    } 
} 

的问题是有,我也将在maintainence意见在那里我直接更新或仅创建子模型使用“保存”而不是“SaveAssociated”其他许多实例。在这种情况下,该模型验证代码将会失败,并显示索引“[0]”未定义或类似的错误。

如何在CakePHP中对SaveAssociated和Save函数调用进行模型验证(特别是对于子模型)中的相同代码?

+0

为什么'MerchantControl.id'永远是如果不等于'MerchantControl.merchant_id'的机会呢?你不应该与外键列进行比较吗?此外[**'验证'设置**](http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveassociated-array-data-null-array-选项 - 阵列)你使用,“真”还是“第一”?并且是从插入中获得的'merchant_id'值,还是从视图传递的值? ps,请始终提及您的确切CakePHP版本! – ndm

回答

0

如果我理解你正确,你想检查urlparam是否已被其他商家使用,换句话说它是否是唯一的。

为什么不使用内置的验证规则isUnique

例子:

public $validate = array(
    'urlparam' => array(
     'In Use by other Merchants' => array(
      'rule' => 'isUnique', 
      'message' => 'URLPARAM belongs to another Merchant' 
     ) 
    ) 
); 
+0

我不能使用isUnique。一个商家可以多次使用相同的URLPARAM,并且这可以作为子模型中的多个记录存在。因此,我相信isUnique不适用于我的情况。我的主要问题仍然是关于使用相同的模型验证代码SaveAssociated和保存 – aDvo