在Behavior的BeforeSave回调中使用Model进行查询是否安全?

时间:2012-04-28 03:21:12

标签: cakephp model callback behavior before-save

我没有在任何地方看到这个记录,所以我问你,亲爱的吃蛋糕。

内部一个CakePHP的 Behavior::BeforeSave(&$Model) 方法,我读写了$Model->data数组的更改。在我完成之前,我需要从数据库中读取一些其他记录。我担心,如果我使用$Model->find(),它将覆盖即将保存的模型中的当前数据。

查看源代码,Model::find()函数会清楚地重置Model::$id变量。这是我后来用来检查字段是否正在更新的变量。

以下是一个例子:

<?php
    class UniqueBehavior extends ModelBehavior {

        function beforeSave(&$Model){

            $value = $Model->data[$Model->alias]['unique_field'];
            $query = array('conditions' => array('unique_field' => $value));
            if ($Model->find('first', $query){
                // Does $Model::find() reset the internal $Model->data array?
                $Model->data[$Model->alias]['unique_field'] = "..."
                //... some other code here
            }

            //ALSO...
            if ($Model->exists()) // Returns true if a record with the currently set ID exists.
            $slug = $Model->field('slug');

            // this should fetch the slug of the currently updated Model::id from the database
            // if I do find()'s, can I trust that the record I'm getting is the right one?
        }
    }
?>

1 个答案:

答案 0 :(得分:1)

您可以随时将当前ID存储在$ tmp中,并在完成后将此存储的ID分配回模型

$tmp = $Model->id;
// ...
$Model->id = $tmp;

这样您就不会遇到使用Model-id的问题。

如果保存与否取决于您在模型中的工作方式。 我 - 例如 - 从不依赖这个id。在任何更新或删除调用等之前,我总是手动将id分配给模型。当然,这不是必需的。不过,你必须要小心。