CakePHP 深度(多个相关模型)验证?
CakePHP deep (multiple related models) validation?
我的模型结构是:
Organization
属于Address
属于CountryCode
所以,Organization
有外键:mailing_address_id
和 physical_address_id
Address
有外键:country_code_id
在Organization
模型中,关系定义为:
public $belongsTo = array(
'MailingAddress' => array('className'=>'Address', 'foreignKey'=>'mailing_address_id')
, 'PhysicalAddress' => array('className'=>'Address', 'foreignKey'=>'physical_address_id')
);
这似乎工作得很好 - 验证功能正常,等等。
在Address
模型中,关系定义为:
public $belongsTo = array(
'CountryCode' => array('className'=>'CountryCode', 'foreignKey'=>'country_code_id')
);
在我的 OrganizationsController
中,在创建新组织的函数中,我正在使用以下代码测试验证:
if($this->Organization->saveAll(
$data, array('validate'=>'only')
)) {
// Validates
$this->DBG('Org validated.');
} else {
// does not validate
$this->DBG('Org NOT NOT NOT validated.'.print_r($this->Organization->invalidFields(),true));
}
$data
数组看起来像这样进入验证。
2015-06-08 21:03:38 Debug: Array
(
[Organization] => Array
(
[name] => Test Organization
)
[MailingAddress] => Array
(
[line1] => 100 Main Street
[line2] =>
[city] => Houston
[state] => TX
[postal_code] => 77002
[CountryCode] => Array
(
[name] => United St
)
)
[PhysicalAddress] => Array
(
[line1] => 100 Main Street
[line2] =>
[city] => Houston
[state] => TX
[postal_code] => 77002
[CountryCode] => Array
(
[name] => United St
)
)
)
国家代码不应使用我在 CountryCode
模型中设置的规则进行验证:
public $validate = array(
'name' => array(
'nonemptyRule' => array(
'rule' => 'notEmpty'
,'required' => 'create'
,'message' => 'Must be provided.'
)
,'dupeRule' => array(
'rule' => array('isUnique', array('name','code'), false)
,'message' => 'Duplicate'
)
)
,'code' => array(
'rule' => 'notEmpty'
,'required' => 'create'
,'message' => 'Must be provided.'
)
);
但是,Organization->saveAll
.
的验证通过
此外,如果我尝试从 OrganizationController
访问 CountryCode
模型,它不会加载。
如:
$this->Organization->MailingAddress->CountryCode->invalidate('name','Invalid!');
在那种情况下,我得到一个错误 CountryCode
是 null
。
知道为什么 CountryCode 不会被验证或加载吗?
验证是否应该在两步之外进行?
事实证明,在验证(和保存)时有一个 deep 选项。它在此处使用 saveAll 选项记录:
http://book.cakephp.org/2.0/en/models/saving-your-data.html
因此,如果您像这样包含 deep 选项,则问题中的验证块工作得很好:
if($this->Organization->saveAll(
$data, array('validate'=>'only', 'deep'=>true)
)) {
// Validates
$this->DBG('Org validated.');
} else {
// does not validate
$this->DBG('Org NOT NOT NOT validated.'.print_r($this->Organization->invalidFields(),true));
}
我的模型结构是:
Organization
属于Address
属于CountryCode
所以,Organization
有外键:mailing_address_id
和 physical_address_id
Address
有外键:country_code_id
在Organization
模型中,关系定义为:
public $belongsTo = array(
'MailingAddress' => array('className'=>'Address', 'foreignKey'=>'mailing_address_id')
, 'PhysicalAddress' => array('className'=>'Address', 'foreignKey'=>'physical_address_id')
);
这似乎工作得很好 - 验证功能正常,等等。
在Address
模型中,关系定义为:
public $belongsTo = array(
'CountryCode' => array('className'=>'CountryCode', 'foreignKey'=>'country_code_id')
);
在我的 OrganizationsController
中,在创建新组织的函数中,我正在使用以下代码测试验证:
if($this->Organization->saveAll(
$data, array('validate'=>'only')
)) {
// Validates
$this->DBG('Org validated.');
} else {
// does not validate
$this->DBG('Org NOT NOT NOT validated.'.print_r($this->Organization->invalidFields(),true));
}
$data
数组看起来像这样进入验证。
2015-06-08 21:03:38 Debug: Array
(
[Organization] => Array
(
[name] => Test Organization
)
[MailingAddress] => Array
(
[line1] => 100 Main Street
[line2] =>
[city] => Houston
[state] => TX
[postal_code] => 77002
[CountryCode] => Array
(
[name] => United St
)
)
[PhysicalAddress] => Array
(
[line1] => 100 Main Street
[line2] =>
[city] => Houston
[state] => TX
[postal_code] => 77002
[CountryCode] => Array
(
[name] => United St
)
)
)
国家代码不应使用我在 CountryCode
模型中设置的规则进行验证:
public $validate = array(
'name' => array(
'nonemptyRule' => array(
'rule' => 'notEmpty'
,'required' => 'create'
,'message' => 'Must be provided.'
)
,'dupeRule' => array(
'rule' => array('isUnique', array('name','code'), false)
,'message' => 'Duplicate'
)
)
,'code' => array(
'rule' => 'notEmpty'
,'required' => 'create'
,'message' => 'Must be provided.'
)
);
但是,Organization->saveAll
.
此外,如果我尝试从 OrganizationController
访问 CountryCode
模型,它不会加载。
如:
$this->Organization->MailingAddress->CountryCode->invalidate('name','Invalid!');
在那种情况下,我得到一个错误 CountryCode
是 null
。
知道为什么 CountryCode 不会被验证或加载吗?
验证是否应该在两步之外进行?
事实证明,在验证(和保存)时有一个 deep 选项。它在此处使用 saveAll 选项记录:
http://book.cakephp.org/2.0/en/models/saving-your-data.html
因此,如果您像这样包含 deep 选项,则问题中的验证块工作得很好:
if($this->Organization->saveAll(
$data, array('validate'=>'only', 'deep'=>true)
)) {
// Validates
$this->DBG('Org validated.');
} else {
// does not validate
$this->DBG('Org NOT NOT NOT validated.'.print_r($this->Organization->invalidFields(),true));
}