3

在我的 CakePHP 1.2.5 应用程序中,我有一个属于Profile模型的User模型。User 模型有一个username字段,find()在 Profile 模型上执行 a 时,我也希望始终自动检索其值User.usernamebeforeFind()我认为修改我的 Profile 模型的方法以自动包含所需的字段是有意义的。

这是我试图做的事情:

public function beforeFind($queryData) {
    // determine if the username data was already requested to be included in the return data via 'User.username' or 'User' => array('username').
    $hasUserData  = isset($queryData['contain']) && in_array("User.{$this->User->displayField}", $queryData['contain']);
    $hasUserData |= isset($queryData['contain']['User']) && in_array($this->User->displayField, $queryData['contain']['User']);

    // request the the username data be included if it hasn't already been requested by the calling method
    if (!$hasUserData) {
        $queryData['contain']['User'][] = $this->User->displayField;
    }

    return $queryData;
}

我可以看到 的值$queryData['contain']正在正确更新,但未检索到用户名数据。我查看了该find()方法的 CakePHP 核心代码,发现beforeFind()在所有 Behaviors 的回调之后调用了回调,这意味着$queryData['contain']在我能够修改它之前,Containable 已经完成了它需要对 的值做的事情。

我怎样才能在不破解核心的情况下解决这个问题?

4

2 回答 2

6

我解决了它,所以这是我的答案,以防有人遇到同样的并发症。无法在 beforeFind 中指定可包含字段,因为所有 Behaviors 的beforeFind()方法都在模型方法之前beforeFind()调用。

因此,我有必要find()直接在 Profile 模型上修改该方法,以便附加我的自定义可包含字段。

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain("{$this->User->alias}.{$this->User->displayField}");
    return parent::find($conditions, $fields, $order, $recursive);
}
于 2009-10-20T03:13:01.173 回答
1

马特,我相信这是一个很好的解决方案。我正在使用 CakePHP 2.0.4,我打算只获取用户模型数据。

仅作记录,设置 actAs 为 User 模型

class User extends AppModel {
    public $name = 'User';
    public $belongsTo = array('Role');
    public $actsAs = array('Containable');
    ...

然后我以这种方式覆盖 find 方法:

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain();
    return parent::find($conditions, $fields, $order, $recursive);
}

或者,如果打算获取 Profile 数据,例如:

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain(array('Profile'));
    return parent::find($conditions, $fields, $order, $recursive);
}
于 2012-02-18T12:40:01.827 回答