【问题标题】:Receive model data inside a CakePHP model callback function在 CakePHP 模型回调函数中接收模型数据
【发布时间】:2012-09-30 19:09:54
【问题描述】:

我尝试在 CakePHP 2.1 的模型回调函数中使用现有模型数据,但无法正常工作。 我所做的是尝试在 beforeValidate() 回调中获取用户角色并检查它是否为空。如果是,我会设置它。通常我是这样做的,而且对于第一次创建记录来说它工作得很好。

if (empty($this->data[$this->alias]['role']))
    $this->data[$this->alias]['role'] = 'user';

问题是,每次更新现有记录(用户)时,都会再次设置角色。

问题:那么,我如何检查字段role是否已经设置在记录数据中,而不是post数据(好像$this->data[$this->alias]只包含POST数据)?

【问题讨论】:

    标签: cakephp callback cakephp-2.1 datamodel


    【解决方案1】:

    据我所知,这个问题有三种解决方案。

    1. 在数据库列中设置一个默认值(最简单,最好?)
    2. 每次都为您的输入添加角色。
    3. 查找用户并在缺少角色时添加角色

    前两个选项似乎很明显,所以我只说明最后一个。

    public function beforeValidate() {
      if (!empty($this->id) {
        $this->data[$this->alias][$this->primaryKey] = $this->id;
      }
      if (!empty($this->data[$this->alias][$this->primaryKey])) {
        // user exists, check their data
        $id = $this->data[$this->alias][$this->primaryKey];
        $user = $this->find('first', array(
          'conditions' => array($this->primaryKey => $id)
        ));
        $this->data[$this->alias]['role'] = $user[$this->alias]['role'];
      }
      if (empty($this->data[$this->alias]['role'])) {
        // new user but missing a role
        $this->data[$this->alias]['role'] = 'user';
      }
      return true;
    }
    

    此回调将检查是否传递了 ID,如果是,它将查找用户并填充 role 字段。然后,它会检查一个空角色并在必要时用默认值填充它。显然他拥有的代码越多,出现错误的可能性就越大,所以我建议使用默认列值的第一个选项。

    【讨论】:

    • 感谢 Jeremy,这看起来是解决这种行为的好方法。
    • 酷,很高兴其中一个选项有效!请记住,前两个总是最快、最少(潜在)错误的选项。
    【解决方案2】:

    尝试:

    if (empty($this->data[$this->alias]['role']) && empty($this->role)) {
       $this->data[$this->alias]['role'] = 'user';
    }
    

    【讨论】:

    • 我之前尝试过,除了$this->id,这些字段总是返回null。我可以想象 ID 正在工作,因为我在控制器方法中使用 $this->User->id = $id;
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多