CakePHP 深度(多个相关模型)验证?

CakePHP deep (multiple related models) validation?

我的模型结构是:

Organization属于Address属于CountryCode

所以,Organization 有外键:mailing_address_idphysical_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!');

在那种情况下,我得到一个错误 CountryCodenull

知道为什么 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));
}