3

私のProfileCakePHP1.2.5アプリには、モデルに属するモデルがありUserます。ユーザーモデルにはusernameフィールドがありfind()、プロファイルモデルでを実行するときは、常にの値も自動的に取得したいと思いUser.usernameます。beforeFind()プロファイルモデルのメソッドを変更して、目的のフィールドが自動的に含まれるようにするのが理にかなっていると思います。

これが私がやろうとしたことです:

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コアコードを調べたところ、すべてのBehaviorsのコールバックの後にコールバックが呼び出されていることがわかりました。つまり、Containableは、変更する前にbeforeFind()、の値で必要な処理をすでに実行していました。$queryData['contain']

コアをハッキングせずにこれを回避するにはどうすればよいですか?

4

2 に答える 2

6

私はそれを解決したので、誰かが同じ合併症を持っている場合の私の答えはここにあります。モデルのメソッドのbeforeFind()にすべてのBehaviorsのメソッドが呼び出されるため、beforeFindで包含可能なフィールドを指定することはできません。beforeFind()

find()そのため、カスタムの包含可能フィールドを追加するには、プロファイルモデルでメソッドを直接変更する必要がありました。

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を使用していて、ユーザーモデルデータのみをフェッチするつもりでした。

念のため、actsAsforUserモデルを設定します

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);
}

または、プロファイルデータをフェッチする場合は、次のようになります。

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 に答える