【问题标题】:cakephp saveAssociated and validation foreign_key failscakephp saveAssociated 和验证 foreign_key 失败
【发布时间】:2015-07-09 07:59:09
【问题描述】:

我有两个模型,我们将分别命名为 Model 和 RelatedModel。模型有很多相关模型。因此,如果我在验证数组上添加外键验证,例如:

public $validate = array(
'foreignKey' => array(
            'rule' => 'numeric',
            'required' => true,
            'message' => 'The id of relatedmodel should be a number'
        )
)

在我创建了一个 add() 函数来保存新寄存器并在这个函数中我使用 saveAssociated 和验证 true 之后,这个函数失败并抛出错误“相关模型的 id 应该是一个数字”。

我正在调试代码,并且 saveAssociated 在保存模型之前同时检查两个模型的验证。

这是个问题吗?

我认为这个函数应该做的是验证模型,保存它,添加相关模型的foreignKey,然后在保存之前验证它。

【问题讨论】:

    标签: validation cakephp cakephp-2.6


    【解决方案1】:

    我最近才遇到这个问题。这不是问题,不幸的是,saveAssociated() 就是这样设计的。

    您可以使用模型验证器即时更改required => true。查看本书了解更多信息。

    http://book.cakephp.org/2.0/en/models/data-validation.html#dynamically-change-validation-rules

    【讨论】:

    • 这很好,我认为这是最好的解决方案。我一直认为这是 saveAssociated 验证的问题。
    【解决方案2】:

    按照您给定的规则,这可以正常工作。 Cake 中的required 意味着它希望在保存之前在保存数据中设置foreignKey 的值。所有验证都将在 Cake 保存数据之前进行(因此在生成 foreignKey 之前)。

    如果您允许 Cake 在幕后为您生成,则无需验证它是否为数字。如果您想检查它是否正在为UPDATE 传递数据,您可以将required 修改为仅用于update,如下所示:-

    public $validate = array(
        'foreignKey' => array(
            'rule' => 'numeric',
            'required' => 'update',
            'message' => 'The id of relatedmodel should be a number'
        )
    )
    

    我个人不会费心验证外键,除非用户设置它们而不是 Cake。

    更新:

    要验证foreignKey 是否存在于表单提交中,您可以从验证规则中删除required 选项:-

    public $validate = array(
        'foreignKey' => array(
            'rule' => 'numeric',
            'message' => 'The id of relatedmodel should be a number'
        )
    );
    

    这将允许您在foreignKey 不存在的地方传递数据,而不会引发验证错误,同时验证它是否存在。

    【讨论】:

    • 我需要检查,因为有时我有选择表单来选择一个 id,如果我不检查 foreign_key 是数字还是 notEmpty,如果选择是,我无法显示错误消息空的。
    • 我已经相应地更新了我的答案。基本上放弃required 选项,因为它不是你想要的。
    • 我认为这是一种解决方法,但在我之前的案例中应该验证密钥。如果您将保存与模型一起使用,请将键设置为相关模型,然后再次保存。一切正常。
    • 我怀疑你误解了 required 在 Cake 中的含义。它与notEmpty 不同。这意味着它必须存在于提交的数据中,在您的情况下它不是,因此您的验证规则不正确。我更新的答案显示了一个验证规则,只要手动设置数据(通过用户)而不是由 Cake 设置,就会检查该规则。如果 Cake 正在设置它,则无需验证它。如果 Cake 未能创建外键,那是因为您的代码中存在错误,而不是验证问题。
    • 但是我有另一个带有 save() 的控制器。我理解完全需要,当您在视图中使用带有选择元素的 save() 时,应该需要 foreignKey。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多