تعديل الحقول التي يمكن احتواءها المطلوبة في رد الاتصال قبل الولادة؟

StackOverflow https://stackoverflow.com/questions/1591569

سؤال

في تطبيق Cakephp 1.2.5 ، لديّ Profile النموذج الذي ينتمي 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'] يتم تحديثه بشكل صحيح ، لكن بيانات اسم المستخدم لم يتم استردادها. نظرت إلى رمز Cakephp الأساسي لـ find() الطريقة ، ووجدت أن beforeFind() يتم استدعاء رد الاتصال بعد عمليات الاسترجاعات الخاصة بجميع السلوكيات ، مما يعني أن الاحتراف قد فعل بالفعل ما تحتاج إلى فعله بقيمة $queryData['contain'] قبل أن أتمكن من تعديله.

كيف يمكنني العمل حول هذا دون اختراق النواة؟

هل كانت مفيدة؟

المحلول

لقد قمت بحلها ، لذا ها هي إجابتي في حال كان لدى أي شخص نفس المضاعفات. لا يمكن تحديد حقول قابلة للاحتفال في مسبقًا منذ جميع السلوكيات 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);
}

نصائح أخرى

مات ، أعتقد أنه حل جميل. أنا أستخدم CakePhP 2.0.4 وكنت أعتزم جلب بيانات نموذج المستخدم فقط.

فقط للسجل ، إعداد Actsas لنموذج المستخدم

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

ثم تجاوز طريقة البحث بهذه الطريقة:

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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top